【发布时间】:2011-03-25 08:46:30
【问题描述】:
做什么
编译指示包(2)
做吗?什么意思?
【问题讨论】:
做什么
做吗?什么意思?
【问题讨论】:
这意味着结构、联合或类按 2 个字节对齐。这意味着,以下结构将在内存中使用 3 个字节而不是 2 个:
struct MyStruct
{
char Field1;
char Field2;
};
以下将使用 4 个字节:
struct MyStruct
{
WORD Field1;
WORD Field2;
};
更多信息:http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx。重要提示:阅读问题并仅在您知道自己在做什么并且需要它时使用它;-)
【讨论】:
这是一个特定于 Visual-Studio 的 pragma 指令,用于更改 structs 中的成员的对齐方式。可以在here on the MSDN 找到完整的详细信息,但它的要点是它允许您自定义在struct 的元素之间放置多少填充。将东西包装得更紧会占用更少的空间,但会给您带来对齐问题。
【讨论】:
这意味着编译器应该打包结构/类/联合成员,以便它们在 2 字节边界上对齐。
struct Foo {
char c1;
int i1;
};
使用 pack(2),结构将具有:
请注意,所有编译指示都是特定于编译器的 - 不过,这个编译指示适用于 VC 和 gcc。
【讨论】:
这意味着在结构的第一个成员之后的编译指示之后声明的结构、类或联合的每个成员都存储在成员类型大小或 2 字节边界的倍数中,以较小者为准。
#pragma pack(n) 将影响其后的结构、类和联合的大小。
如果您在文件级别使用它,那么在更改它之前保存打包对齐并在您想要应用新打包对齐的声明结束时将其恢复到之前的值可能是一个好主意。
当然,您应该查看编译器的文档。
对于 MS VS 6.0:请参阅 Here。
【讨论】: