Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Solaris和Linux上使用#pragma包(1)时结构大小的差异_C++_C_Linux_G++_Solaris - Fatal编程技术网

C++ Solaris和Linux上使用#pragma包(1)时结构大小的差异

C++ Solaris和Linux上使用#pragma包(1)时结构大小的差异,c++,c,linux,g++,solaris,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

当使用#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;
}
#包括
#包括
#包括
#布拉格语包(1)
结构基{
charm_1;
uint8_t m_2;
uint64_t m_3;
uint64_t m_4;
uint16μmμ5;
uint32_t m_6;
uint32_t m_7;
uint64μmμ8;
uint64_t m_9;
uint32_t m_10;
charm_11[6];
};
struct-Derv:Base{
int m_1;
charm_2[66];
int m_3;
};
#pragma pack()
int main()
{

Std::CUT< P> Sun C++编译器理解语法略有不同。为了使它允许更小的默认对齐,还需要通过选项>代码> -MISALIGN/CODE>。
有关更多详细信息,请参阅。

Pragma pack不保证没有空格;充其量它意味着编译器将尽可能多地打包内容。我的建议是将结构中的项从最大项重新排序到最小项;尽管没有保证(根据定义,Pragma依赖于实现,)根据经验,这通常会消除你的结构包装上的“漏洞”

您可以使用其他编译器标志,但如果您不关心结构中项的顺序,则从最大到最小的顺序通常会以更便于移植的方式进行


(显然,这并不总是一个选项-例如,如果您试图在一个经过连接或传递到某个API的结构中填充,但它适用于内部存储)

Oracle Solaris Studio 12.3 C编译器版本5.12

$ > man cc

... 
 -misalign
       (SPARC) Obsolete. You should not use this option. Use
       the -xmemalign=1i option instead. For a complete list
       of obsolete options and flags, see the C User's Guide.
因此,在带C编译器的Oracle Solaris Studio 12.3上,您应该使用

-xmemalling=1i
,而不是
-disalign

另外,请参见Oracle Solaris Studio 12.3:C用户指南:2.11.19#pragma pack

-仅SPARC支持未对齐。