C中的结构填充

如果我在C中有结构,是否无法安全地将其读/写到跨平台/编译器兼容的文件中?

因为如果我理解正确,每个编译器“填充”基于目标平台不同.

最佳答案
不,那是不可能的.这是因为在二进制级别缺乏C的标准化.

Don Box写道(引自他的书Essential COM,章节COM为更好的C)

C++ and Portability

Once the decision is made to
distribute a C++ class as a DLL, one
is faced with one of the fundamental
weaknesses of C++
, that is, lack of
standardization at the binary level
.
Although the ISO/ANSI C++ Draft
Working Paper attempts to codify which
programs will compile and what the
semantic effects of running them will
be, it makes no attempt to standardize
the binary runtime model of C++
. The
first time this problem will become
evident is when a client tries to link
against the FastString DLL’s import library from
a C++ developement environment other
than
the one used to build the
FastString DLL.

不同的编译器以不同的方式完成结构填充.即使您使用相同的编译器,结构的打包对齐也可能因您使用的pragma pack而有所不同.

不仅如果你编写两个结构完全相同的结构,唯一的区别是它们声明的顺序是不同的,那么每个结构的大小可以(通常是)不同.

例如,看到这个,

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;
}

用gcc-4.3.4编译它,你得到这个输出:

8
12

也就是说,即使两个结构都具有相同的成员,大小也是不同的!

Ideone的代码:http://ideone.com/HGGVl

最重要的是标准没有谈到应该如何填充,因此编译器可以自由做出任何决定,你不能假设所有编译器做出同样的决定.

转载注明原文:C中的结构填充 - 代码日志