gpt4 book ai didi

c++ - 堆栈帧是否在范围内分配和释放?

转载 作者:行者123 更新时间:2023-11-30 05:17:50 25 4
gpt4 key购买 nike

previous question here 开始我一直在查看 VS2015 代码分析的输出,并在可以简化如下的函数中看到关于高堆栈使用率的警告;

class base
{
public:
virtual void Process();
Buffer[10000];
};

class derived1 : public base
{
public:
void Process();
}

class derived2 : public base
{
public:
void Process();
}

void MyFunc(int x)
{
switch(x)
{
case 0:
{
derived1 x;
x.Process();
} break;
case 1:
{
derived2 y;
y.Process();
} break;
}
}

分析警告我在 MyFunc 中使用了 20,000 字节的堆栈。是这样吗,因为所有堆栈变量都在函数入口处分配并在函数导出处释放,而不是在作用域中构造和销毁它们?只是好奇(但还不够好奇,无法浏览汇编输出;))A related question这里并没有完全给我我正在寻找的答案。

最佳答案

堆栈帧分配由编译器自行决定。大多数编译器不会尝试将局部范围与大变量隔离开来,但大多数编译器确实会提供类似 alloca 或 C99 VLA 的功能,它们可以动态扩展现有的堆栈框架。所以架构问题不太可能起作用;这纯粹是实现细节的问题。

您可以在 lambda 表达式中包含局部作用域,以鼓励编译器提供此类隔离:

   switch(x)
{
case 0:
[]{
derived1 x;
x.Process();
}(); break;

case 1:
[]{
derived2 y;
y.Process();
}(); break;
}

不过,没有什么是可以保证的。

您可以使用 godbolt.org在线编译器查看此类示例的机器代码反汇编。看起来这个技巧适用于 GCC,但在 Clang 上它只适用于优化 -O1 或更少,而在 Intel 的编译器上它只适用于 -O0

关于c++ - 堆栈帧是否在范围内分配和释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42050756/

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