64 비트 플랫폼에서는 8 바이트 길이의 접두사를 사용하는 것이 합리적입니다. mem의 4Gb 이상을 처리 할 수 있다면 왜 5Gb 문자열을 허용하지 않을까요? 대답은 "사양 별"인가 아니면 내가 인식하지 못하는 몇 가지 상호 운용성/하위 호환성 호환성 이유가 있습니까? 감사합니다. .64 비트 플랫폼에서 BSTR 길이 접두사가 4 바이트 인 이유는 무엇입니까?
답변
BSTR
데이터 형식은 표준 COM 문자열 데이터 형식입니다. 길이 접두사를 변경하면 다른 비트의 프로세스간에 문자열을 안전하게 이동할 수 없게됩니다 (또는 적어도 훨씬 더 복잡하게 만듭니다). COM이 유일한 교차 비트 간 상호 연결 인프라이기 때문에 BSTR
은 32 비트 프로세스 및 64 비트 프로세스에 대해 동일한 방식으로 작동해야합니다.
서로 다른 비트의 프로세스간에 문자열을 간편하게 마샬링하는 대신 2GB의 '제한'을 부과합니다.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069%28v=vs.85%29.aspx
BSTR은 첫 번째 속성이 그래서, 길이 있습니다
대부분의 64 비트 컴파일러 구현은 LP64 (리눅스/유닉스) 또는 LLP64 (Windows)를 사용하여 해결하지, 접두사 길이 문자열 그래서 INT의 길이는 32 비트
남아또 다른 이유는 아마도 이전 버전과의 호환성
나는 질문을 편집했다. 내가 뭘 물어 보는 이유는 4 바이트 int 대신에 size_t를 가지지 않는 이유이다. –
int
렌을 받아
MultiByteToWideChar
같은 플랫폼의 API와의 호환성을 위해입니다
gths. 32 비트 길이에서 작동하는 더 많은 문자열 API가 있습니다.
길이가 2GB 이상인 BSTR
이 문제에 대한 최상의 해결책이 될 수있는 시나리오를 생각할 수 없기 때문에 실제로는 실질적인 제한이 아닙니다.
감사합니다. 32 비트와 64 비트 프로세스간에 BSTR을 전달할 수 있다는 것을 알지 못했습니다. –
어떻게 재 할당없이 BSTR이 32에서 64 비트 프로세스로 넘어갈 것입니까? –
@David 재 할당 "BSTR"의 레이아웃이 문서화됩니다. 사용자 정의 및 시스템 제공 마샬 러는이 문서화 된 레이아웃에 의존합니다. 즉, 메모리의 해당 데이터 바로 앞에 4 바이트 길이의 접두사가있는 데이터 문자열에 대한 포인터입니다. 공유 메모리에서 상태를 유지하는 객체에 대해 최적화 된 마샬 러를 고려하십시오. 만약 그 메모리가 두 프로세스 모두에 매핑된다면, 서로 다른 비트 니스에 대해 서로 다른 메모리 레이아웃을 갖는'BSTR'을 가질 수 없습니다. – IInspectable