Naw*_*waz 49
不,那是不可能的.这是因为在二进制级别缺乏C++的标准化.
Don Box写道(引用他的书Essential COM,COM作为更好的C++章节)
C++和可移植性
一旦决定将C++类作为DLL分发,就会遇到C++的一个基本弱点,即在二进制级别缺乏标准化.虽然ISO/ANSI C++草案工作文件试图编写哪些程序将编译以及运行它们的语义效果是什么,但它没有尝试标准化C++的二进制运行时模型.这个问题第一次变得明显,当客户端试图从C++开发环境(而不是用于构建FastString DLL的环境)链接FastString DLL的导入库时.
不同的编译器以不同的方式完成结构填充.即使您使用相同的编译器,结构的打包对齐也可能因您正在使用的pragma包而不同.
不仅如果你编写两个结构完全相同的结构,唯一的区别是它们声明的顺序是不同的,那么每个结构的大小可以(通常是)不同.
例如,看到这个,
struct A
{
char c;
char d;
int i;
};
struct B
{
char c;
int i;
char d;
};
int main() {
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
}
Run Code Online (Sandbox Code Playgroud)
用它编译gcc-4.3.4,你得到这个输出:
8
12
Run Code Online (Sandbox Code Playgroud)
也就是说,即使两个结构都具有相同的成员,大小也是不同的!
Ideone的代码:http://ideone.com/HGGVl
最重要的是标准没有谈到应该如何填充,因此编译器可以自由做出任何决定,你不能假设所有编译器做出同样的决定.
Lin*_*cer 20
如果您有机会自己设计结构,那么它应该是可能的.基本思想是你应该设计它,这样就不需要在其中插入填充字节.第二个技巧是你必须处理结束的差异.
我将描述如何使用标量构造结构,但是您应该能够使用嵌套结构,只要您为每个包含的结构应用相同的设计.
首先,C和C++的基本事实是类型的对齐不能超过类型的大小.如果它会,那么就不可能使用分配内存malloc(N*sizeof(the_type)).
从最大的类型开始布局结构.
struct
{
uint64_t alpha;
uint32_t beta;
uint32_t gamma;
uint8_t delta;
Run Code Online (Sandbox Code Playgroud)
接下来,手动填充结构,以便最终匹配最大类型:
uint8_t pad8[3]; // Match uint32_t
uint32_t pad32; // Even number of uint32_t
}
Run Code Online (Sandbox Code Playgroud)
下一步是确定结构是否应以小端或大端格式存储.最好的办法是"交换"的所有元素在原地写入前或读取结构,如果存储格式不匹配主机系统的字节序后.
不,没有安全的方法.除了填充之外,还必须处理不同的字节顺序和不同大小的内置类型.
您需要定义文件格式,并将结构转换为该格式或从该格式转换.序列化库(例如boost :: serialization或google的协议缓冲区)可以帮助解决这个问题.
| 归档时间: |
|
| 查看次数: |
51134 次 |
| 最近记录: |