在代码审查期间,我遇到了一些定义简单结构的代码,如下所示:
class foo {
unsigned char a;
unsigned char b;
unsigned char c;
}
在其他地方,定义了这些对象的数组:
foo listOfFoos[SOME_NUM];
稍后,这些结构被原始复制到缓冲区中:
memcpy(pBuff,listOfFoos,3*SOME_NUM);
此代码依赖于以下假设:a.) foo 的大小为 3,并且没有应用填充,b.) 这些对象的数组被打包,它们之间没有填充。
我已经在两个平台(RedHat 64b、Solaris 9)上使用 GNU 进行了尝试,并且在这两个平台上都可以使用。
以上假设是否有效?如果不是,在什么情况下(例如操作系统/编译器的更改)它们可能会失败?
最佳答案
这样做肯定更安全:
sizeof(foo) * SOME_NUM
关于C++ 数据成员对齐和数组打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1676385/