gpt4 book ai didi

c++ - 自动存储时长的具体要求是什么?

转载 作者:IT老高 更新时间:2023-10-28 23:17:34 29 4
gpt4 key购买 nike

以下代码取决于编译器:

int main()
{
srand( 0 );
if( rand() ) {
char buffer[600 * 1024] = {};
printf( buffer );
} else {
char buffer[500 * 1024] = {};
printf( buffer );
}
return 0;
}

在最大堆栈大小等于 1 兆字节的系统上运行时,要么打印空字符串,要么因堆栈溢出而崩溃。

不同之处在于不同的编译器分配自动存储的方式不同。大多数编译器分配存储 for all objects on function start ,因此在上面的代码中,它们分配了 600+400=1100 KB,这会导致堆栈溢出。一些编译器更聪明,他们发现这两个数组永远无法同时访问,因此他们重用相同的内存并且只分配 600 KB 并且程序运行良好。

现在标准说 (3.7/1) 存储持续时间定义了存储的最小潜在生命周期,然后 (3.7.2/1) 这些对象的存储 [with自动持续时间]持续到创建它们的 block 存在

我不明白如何将 3.7/1 和 3.7.2/1 一起应用。一个说持续时间是最小潜力,另一个明确说它会持续到 block 存在。看起来根据第一个分配策略是合法的,但第二个要求只使用“重用”分配策略。

3.7/1 和 3.7.2/1 如何共存?在最坏的情况下(第一种策略)分配比程序需要更多的内存是否合法?

最佳答案

我将 3.7/阅读为不同存储类(自动、静态、动态)的介绍性描述和定义,而不是每个存储类的实现要求......然后在 3.7.2/1 中描述了自动的实现要求.

阅读 3.7.2/1 它并没有禁止它的存在时间超过 block 的存在时间(这只是最低限度) - 恕我直言,这是编译器实现者关于可能的优化的一个机会......

关于c++ - 自动存储时长的具体要求是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103145/

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