为什么在64位平台上BSTR长度前缀为4个字节?

Ale*_*tov 3 c 64-bit winapi bstr 32bit-64bit

似乎在64位平台上,有一个8字节长度的前缀是合理的.如果我们可以解决超过4Gb的内存,为什么不允许,比如5Gb字符串?答案只是"按规范"还是存在一些我不知道的互操作性/向后兼容性原因?谢谢.

IIn*_*ble 7

BSTR数据类型是标准COM字符串数据类型.更改长度前缀将使得无法在不同位数的进程之间安全地移动字符串(或者至少使其更加复杂).由于COM是唯一相关的跨位互操作基础结构,因此必须使BSTR32位进程和64位进程的行为方式相同.

这是一个权衡,强加2GB的"限制"以换取在不同位数的进程之间无障碍地编组字符串.

  • 无论是否使用@David重新分配,都会记录BSTR的布局。定制的和系统提供的编组器都依赖于这种文档化的布局:指向内存中紧接该数据之前具有4字节长前缀的数据字符串的指针。考虑将对象的状态保留在共享内存中的优化编组器。如果该内存被映射到两个进程中,则不能使`BSTR`具有针对不同位的不同内存布局。 (2认同)

Dav*_*nan 5

一个很好的理由是与平台API兼容,例如MultiByteToWideChar接受int长度.还有许多字符串API可以使用32位长度.

它实际上并不是一个真正的限制,因为我无法想象BSTR长度> 2GB的问题是解决问题的最佳方案.