c++ - 在 Solaris 和 Linux 上使用#pragma pack(1) 时结构大小的差异

标签 c++ c linux g++ solaris

当使用#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/

相关文章:

c - 在main之前定义变量

linux - 用于创建 Azure Linux VM 并在其中设置 FTP 连接的 Powershell 脚本

Windows、Mac 和 Linux (Unix) 上的 Java 程序

c++ - 在 C++ 中将数字转换为具有指定长度的字符串

java - 无法使用 execl() 启动 jar

c - 结构体和字符串

c - 在 C 中使用 malloc() 的主要原因是什么

linux - 从匹配多个模式的一个文件创建新的多个文件的快速方法

c++ - 创建窗口和线程 - C++

c++ - 可变参数模板方法特化