是否可以打包具有特定对齐方式的局部变量?

问题描述 投票:1回答:1

代码:

#include <stdio.h>
int main() {
    int a;
    printf("%p\n", &a);
    char b[10];
    printf("%p\n", &b);
    int c;
    printf("%p\n", &c);
}

输出:

0061fefc
0061fef2
0061feec

[很明显b占用12个字节的内存,因为默认的内存对齐方式使c的起始地址是4的倍数。可以禁用内存对齐方式吗?我知道#pragma pack可以打包结构,它可以打包局部变量以使b仅占用10个字节吗?这是一个使我感兴趣的面试问题。任何帮助将不胜感激!

c++ c memory-management
1个回答
2
投票

C标准没有提供任何用于请求对象轻松对齐的工具,并且对于独立对象(不是结构成员的对象),这种功能几乎没有价值。

结构有时会打包,使用对标准C的扩展,因为其中的字节需要连续排列以用于某些特定用途,例如在网络消息中传输它们,或者因为填充它们时可能会浪费大量空间该结构的许多实例都保存在内存中。一个单独的对象不会发生这种目的。

所示的char数组不占用十二个字节。它占用十个字节。另外两个字节未使用,或者由编译器用于其他目的,这些目的在检查的地址中不明显。在结构中,保留填充字节(保持不可用以供其他用途)以提供所需的对齐方式。在这种情况下,字节可能已被跳过以提供所需的对齐方式,但并非为此目的保留它们。如果需要两个字节的对象,则编译器可以将其插入到这些字节中。

由于对齐要求而浪费的堆栈空间通常很小,因为与结构成员不同,编译器可以自由地重新排列对象以有效地使用空间。并且堆栈指针通常仍必须满足应用程序二进制接口(ABI)的对齐要求,因此,无论堆栈上对象的对齐要求如何,仍需要一些对齐空间。

© www.soinside.com 2019 - 2024. All rights reserved.