c – 没有堆栈分配整个程序编译?

前端之家收集整理的这篇文章主要介绍了c – 没有堆栈分配整个程序编译?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果您编写的应用程序是:

>单线程
>调用图中没有循环
>不使用alloca或VLAs

现代整个程序优化编译器可以优化所有堆栈分配(例如GCC,MSVC,ICC)吗?在这种情况下,它似乎应该能够静态地分配所有可能的堆栈空间. “整个程序”我的意思是编译器可以访问/ all /源代码(在运行时没有可能的dlopen’ing事物等).

解决方法

如果你可以保证你陈述的条件,那么是:有可能有效地将堆栈完全静态分配.每个函数都有一个堆栈内存块.

但是,实际编译器会这样做吗?没有.

它绝对没有任何事情可做.实际上,它可能获得的收益少于零.通常,大部分工作堆栈都在缓存中,因此对它的修改非常便宜.如果堆栈在静态内存中,那么任何特定函数的“堆栈”内存被缓存的唯一时间就是你最近调用过那个函数.使用真正的堆栈,您更有可能在缓存中工作.

此外,为每个函数提供一个堆栈内存块可以轻松地使程序的静态内存使用量大大超出需要的范围.堆栈是固定大小的构造;无论你有多少函数,堆栈都占用一定的大小.如果你有100,000个函数,并且每个函数占用64个字节的空间,那么你的静态“堆栈”必须占用大约6.4MB的空间.

为什么?你永远不会在任何时候使用大部分内存.该程序可以在1MB甚至512KB的堆栈中运行良好;为什么要占用6倍的内存?

因此,它既不是性能优化,也可能会破坏程序的内存.

猜你在找的C&C++相关文章