【发布时间】:2014-01-28 14:57:55
【问题描述】:
当使用#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
感谢您的宝贵时间。
【问题讨论】: