不,bar
不会被紧紧包装。它必须明确标记为__attribute__ ((__packed__))
要打包。考虑以下示例:
#include <stdio.h>
struct
{
struct
{
char c;
int i;
} bar;
char c;
int i;
} foo1;
struct __attribute__ ((__packed__))
{
struct
{
char c;
int i;
} bar;
char c;
int i;
} foo2;
struct
{
struct __attribute__ ((__packed__))
{
char c;
int i;
} bar;
char c;
int i;
} foo3;
struct __attribute__ ((__packed__))
{
struct __attribute__ ((__packed__))
{
char c;
int i;
} bar;
char c;
int i;
} foo4;
int main()
{
printf("sizeof(foo1): %d\n", (int)sizeof(foo1));
printf("sizeof(foo2): %d\n", (int)sizeof(foo2));
printf("sizeof(foo3): %d\n", (int)sizeof(foo3));
printf("sizeof(foo4): %d\n", (int)sizeof(foo4));
return 0;
}
该程序的输出(使用 gcc 4.2、64 位和 clang 3.2、64 位编译)是:
sizeof(foo1): 16
sizeof(foo2): 13
sizeof(foo3): 12
sizeof(foo4): 10
如果 astruct
及其嵌套struct
的 s 都被紧密打包,则__attribute__ ((__packed__))
必须为 each 显式声明struct
。这是有道理的,如果您考虑将嵌套分开以便bar
's 的类型在 之外声明foo
,如下所示:
// Note Bar is not packed
struct Bar
{
char c;
int i;
};
struct __attribute__ ((__packed__))
{
// Despite foo being packed, Bar is not, and thus bar will not be packed
struct Bar bar;
char c;
int i;
} foo;
在上面的例子中,bar
为了被打包,Bar
必须声明为__attribute__ ((__packed__))
. 如果您要复制“n”粘贴这些结构以便像在第一个代码示例中那样嵌套它们,您会看到打包行为是一致的。
对应的 C++ 代码(使用 g++ 4.2 和 clang++ 3.2 编译,针对 64 位,其结果与上述完全相同):
#include <iostream>
struct Foo1
{
struct Bar1
{
char c;
int i;
} bar;
char c;
int i;
} foo1;
struct __attribute__ ((__packed__)) Foo2
{
struct Bar2
{
char c;
int i;
} bar;
char c;
int i;
} foo2;
struct Foo3
{
struct __attribute__ ((__packed__)) Bar3
{
char c;
int i;
} bar;
char c;
int i;
} foo3;
struct __attribute__ ((__packed__)) Foo4
{
struct __attribute__ ((__packed__)) Bar4
{
char c;
int i;
} bar;
char c;
int i;
} foo4;
int main()
{
std::cout << "sizeof(foo1): " << (int)sizeof(foo1) << std::endl;
std::cout << "sizeof(foo2): " << (int)sizeof(foo2) << std::endl;
std::cout << "sizeof(foo3): " << (int)sizeof(foo3) << std::endl;
std::cout << "sizeof(foo4): " << (int)sizeof(foo4) << std::endl;
}