gpt4 book ai didi

gcc中的C内存管理

转载 作者:太空狗 更新时间:2023-10-29 17:18:27 25 4
gpt4 key购买 nike

我在 Ubuntu 12.10 x86_64 上使用 gcc 4.7.2 版。

首先,这些是我终端上数据类型的大小:

sizeof(char) = 1    

sizeof(short) = 2 sizeof(int) = 4
sizeof(long) = 8 sizeof(long long) = 8

sizeof(float) = 4 sizeof(double) = 8
sizeof(long double) = 16

现在请看一下这段代码:

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

如果我没记错的话,我们无法预测 c 的地址。 .但是每次这个程序都会给出一些以 f 结尾的随机十六进制地址.所以下一个可用位置将是一些以 0 结尾的十六进制值.我在其他数据类型的情况下也观察到了这种模式。对于 int 值,地址是一些以 c 结尾的十六进制值.对于 double,它是一些以 8 结尾的随机十六进制值等等。

所以我在这里有 2 个问题。

1) 谁在管理这种内存分配?它是 gcc 还是 C 标准?

2) 不管是谁,为什么会这样?为什么变量的存储方式是下一个可用内存位置从以 0 结尾的十六进制值开始?有什么特别的好处吗?

现在请看一下这段代码:

int main(void)
{
double a = 10.2;
int b = 20;
char c = 30;
short d = 40;

printf("&a = %p\n", &a);
printf("&b = %p\n", &b);
printf("&c = %p\n", &c);
printf("&d = %p\n", &d);

return 0;
}

现在,我所观察到的对我来说是全新的。我认为变量会按照声明的顺序存储。但不是!事实并非如此。这是随机运行之一的示例输出:

&a = 0x7fff8686a698
&b = 0x7fff8686a694
&c = 0x7fff8686a691
&d = 0x7fff8686a692

似乎变量按照其大小的递增顺序进行排序,然后它们以相同的排序顺序存储,但保持观察 1。即最后一个变量(最大的一个)以下一个可用的方式存储内存位置是以 0 结尾的十六进制值.

这是我的问题:

3) 谁是幕后黑手?它是 gcc 还是 C 标准?

4) 为什么要浪费时间先对变量进行排序然后再分配内存,而不是直接按照“先到先得”的原则分配内存?这种排序然后分配内存的具体好处是什么?

现在请看一下这段代码:

int main(void)
{
char array1[] = {1, 2};
int array2[] = {1, 2, 3};

printf("&array1[0] = %p\n", &array1[0]);
printf("&array1[1] = %p\n\n", &array1[1]);

printf("&array2[0] = %p\n", &array2[0]);
printf("&array2[1] = %p\n", &array2[1]);
printf("&array2[2] = %p\n", &array2[2]);

return 0;
}

现在这对我来说也很震惊。我观察到的是,如果 elements of an array >= 2 数组总是存储在某个以“0”结尾的随机十六进制值处如果elements < 2然后它根据观察 1 获取内存位置。

所以这是我的问题:

5) 谁在这背后存储了一个以 0 结尾的随机十六进制值的数组事物 ?它是 gcc 还是 C 标准?

6) 现在为什么要浪费内存?我是说 array2可以在 array1 之后立即存储(因此 array2 的内存位置将以 2 结尾)。但不是那个 array2存储在以 0 结尾的下一个十六进制值处从而在两者之间留下 14 个内存位置。有什么具体好处吗?

最佳答案

栈和堆的起始地址是操作系统给进程的。其他一切都由编译器决定,使用编译时已知的偏移量。其中一些可能遵循您的目标架构中遵循的现有约定,而其中一些则不然。

C 标准对堆栈帧内局部变量的顺序没有强制要求(正如评论中指出的,它甚至根本不强制使用堆栈) .该标准仅在涉及结构时定义顺序,即使那样,它也没有定义特定的偏移量,只是这些偏移量必须按递增顺序排列。通常,编译器会尝试以这样一种方式对齐变量,即访问它们需要尽可能少的 CPU 指令 - 标准允许这样做,但没有强制要求。

关于gcc中的C内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16121668/

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