当使用#pragma pack(1) 时,我发现 Solaris 和 Linux 之间的结构大小存在差异。在 Linux Derv 上大小为 128,但在 Solaris 上大小为 132。有人能告诉我为什么会这样吗?我怎样才能在 Solaris 上达到 128?下面是代码:
#include <inttypes.h>
#include <iostream>
#include <stddef.h>
#pragma pack(1)
struct Base {
char m_1;
uint8_t m_2;
uint64_t m_3;
uint64_t m_4;
uint16_t m_5;
uint32_t m_6;
uint32_t m_7;
uint64_t m_8;
uint64_t m_9;
uint32_t m_10;
char m_11[6];
};
struct Derv : Base {
int m_1;
char m_2[66];
int m_3;
};
#pragma pack()
int main()
{
std::cout << sizeof(Base) << ", " << sizeof(Derv) << std::endl;
std::cout << offsetof(struct Derv, m_1)
<< ", " << offsetof(struct Derv, m_2)
<< ", " << offsetof(struct Derv, m_3)
<< std::endl;
}
编译如下: 在 Linux 上:g++ -Wno-invalid-offsetof struct_test.cpp 在 Solaris 上:CC -g0 -xarch=sse2 -mt struct_test.cpp
版本:
$ g++ -v
使用内置规范。 目标:x86_64-redhat-linux 配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl= http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique -object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj。 jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux 线程模型:posix gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
Solaris 编译器:
$CC-V
CC:Sun C++ 5.9 SunOS_i386 补丁 124864-13 2009/05/26
感谢您的宝贵时间。
最佳答案
Sun C++ 编译器对该 pragma 的理解略有不同。您还需要向它传递选项 -misalign
以允许比默认对齐更小。
引用Sun Studio 12: C++ User's Guide了解更多详情。
关于c++ - 在 Solaris 和 Linux 上使用#pragma pack(1) 时结构大小的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21409036/