gpt4 book ai didi

c++ - 如果在内联函数中使用alloca在堆栈上分配了一个变量,那么在内联函数返回后它的引用是否有效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:04 24 4
gpt4 key购买 nike

我知道编译器可能,而不是应该内联函数展开到调用函数中,以避免与调用out-of相关的开销-行功能。不过,我也知道 inline 函数的链接方式与 out-of-line 函数不同,因此我不能指望它们以完全相同的方式运行。

虽然我实际上使用的是 C++,但我正在开发一个使用 api 的程序,在其中可以方便地使用类似于以下内容的 C 宏:

#define func_alloca(ptr) do { *ptr = alloca(size); memset(*ptr, 0, size); }

为了不在不同的函数中多次重复代码,如果能够将一系列这些 alloca 调用功能化,对我来说会很有用。我的问题是,(特别是在 gcc 中,因为 alloca 是实现定义的,)我可以在 inline 中使用 alloca 初始化堆栈上的变量吗> 功能,并指望他们在外面工作?这是我想做的事情的一个例子:

inline void uses_alloca(type*& ptr){
// do stuff
func_alloca(ptr);
}

void calls_inline(){
type *local_ptr;
uses_alloca(local_ptr);
// is local_ptr valid?
}

如果它确实有效,它会总是有效吗?就像,不仅当编译器选择将 inline 函数展开到调用函数中时?

编辑:

我的猜测是这可能在事实上起作用,因为 alloca 调用在包含的 do{} 本地范围之外已经有效在宏中,因为,如果我理解正确的话,函数在 C++ 中实际上与 do{} block 具有不同级别的范围。我的问题仍然存在:这是 alloca 应该在 gcc 中工作的方式吗?这是定义的行为吗?

最佳答案

如果您使用的是 GCC,预期 行为是其中包含 alloca 的函数不会自动内联。来自 tree-inline :

  /* Refuse to inline alloca call unless user explicitly forced so as
this may change program's memory overhead drastically when the
function using alloca is called in loop. In GCC present in
SPEC2000 inlining into schedule_block cause it to require 2GB of
RAM instead of 256MB. Don't do so for alloca calls emitted for
VLA objects as those can't cause unbounded growth (they're always
wrapped inside stack_save/stack_restore regions. */

这当然没有考虑:

  • 错误
  • 无论如何,编译器内联功能仍然存在,因为它并不完美
  • 优化开关、属性
  • 运气不好

GCC manual page on inline 警告内联函数不适用于 allocaWhy is the use of alloca() not considered good practice?还有一些恐怖故事。

基本上,如果您担心内联可能会影响代码的语义,请不要依赖它。

关于c++ - 如果在内联函数中使用alloca在堆栈上分配了一个变量,那么在内联函数返回后它的引用是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37310099/

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