gpt4 book ai didi

C题: why char actually occupies 4 bytes in memory?

转载 作者:太空狗 更新时间:2023-10-29 15:10:50 28 4
gpt4 key购买 nike

我写了一个小程序来查看 char 在我的内存中占用了多少字节,结果显示 char 实际上在内存中占用了 4 个字节。我知道这主要是因为字对齐并且没有看到 char 只有 1 个字节的优势。 char 为什么不使用 4 个字节?

int main(void)
{
int a;
char b;
int c;
a = 0;
b = 'b';
c = 1;
printf("%p\n",&a);
printf("%p\n",&b);
printf("%p\n",&c);
return 0;
}

输出: 0x7fff91a15c58 0x7fff91a15c5f 0x7fff91a15c54

更新:我不相信 malloc 只会为 char 分配 1 个字节,即使 sizeof(char) 作为参数传递也是如此,因为 malloc 包含一个 header 将确保 header 是字对齐的。有什么意见吗?

更新2:如果要求您在不填充的情况下有效地使用内存,唯一的方法是创建一个特殊的内存分配器吗?或者是否可以禁用填充?

最佳答案

对齐

让我们看看打印 a、b 和 c 地址的输出:

Output: 0x7fff91a15c58 0x7fff91a15c5f 0x7fff91a15c54

注意 b 不在同一个 4 字节边界上吗?而且 a 和 c 是挨着的吗?这是它在内存中的样子,每行占用 4 个字节,最右边的列是第 0 位:

| b | x | x | x | 0x5c5c
-----------------
| a | a | a | a | 0x5c58
-----------------
| c | c | c | c | 0x5c54

这是编译器优化空间和保持词对齐的方式。即使你的 b 地址是 0x5c5f,它实际上并没有占用 4 个字节。如果您使用相同的代码并添加一个短的 d,您将看到:

| b | x | d | d | 0x5c5c
-----------------
| a | a | a | a | 0x5c58
-----------------
| c | c | c | c | 0x5c54

其中d的地址为0x5c5c。短裤将对齐到两个字节,因此您在 c 和 d 之间仍然有一个字节未使用的内存。添加另一个字符,你会得到:

| b | e | d | d | 0x5c5c
-----------------
| a | a | a | a | 0x5c58
-----------------
| c | c | c | c | 0x5c54

这是我的代码和输出。请注意,我的地址会略有不同,但它是地址中我们真正关心的最低有效数字:

int main(void)
{
int a;
char b;
int c;
short d;
char e;
a = 0;
b = 'b';
c = 1;
printf("%p\n",&a);
printf("%p\n",&b);
printf("%p\n",&c);
printf("%p\n",&d);
printf("%p\n",&e);
return 0;
}

$ ./a.out
0xbfa0bde8
0xbfa0bdef
0xbfa0bde4
0xbfa0bdec
0xbfa0bdee

小程序

malloc 的手册页说它“分配大小字节并返回指向已分配内存的指针”。它还说它将“返回一个指向已分配内存的指针,该内存适合任何类型的变量对齐”。根据我的测试,重复调用 malloc(1) 会以“双字”增量返回地址,但我不会指望这一点。

注意事项

我的代码在 x86 32 位机器上运行。其他机器可能略有不同,一些编译器可能以不同的方式进行优化,但这些想法应该是正确的。

关于C题: why char actually occupies 4 bytes in memory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5150447/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com