【发布时间】:2015-06-20 19:47:58
【问题描述】:
据我所知,内联函数是在调用者中替换的代码,这意味着内联函数中编写的任何代码都存在于最后一个函数的堆栈帧中。我碰巧处于需要动态分配内存而不使用malloc的情况。那么,有没有办法让我在内联函数中分配一个可变长度数组,并在函数终止时保持它——你知道,因为堆栈并没有真正展开。
谢谢!
编辑:
我有一个在信号处理程序上下文中调用的函数,由 sigpoll 激活。它尝试从 tcp 套接字读取数据。它读取的数据被组织成我们想出的数据结构;如果你愿意的话,人造“数据包”。不知道缓冲区中有多少数据,“数据包”边界在哪里等。它由信号处理程序调用,因此我们不能使用任何动态内存分配器。
【问题讨论】:
-
你的意思是,当 inline 函数终止时数组保持不变,而当外部函数终止时数组是空闲的?
-
是否需要内联函数,即它们是否从函数内的多个位置调用?能否将alloca'ed 缓冲区传递给内联函数?
-
我认为答案是否定的。 GCC 手册没有完全解决您的情况,但它非常接近:“请注意,函数定义中的某些用法可能使其不适合内联替换。这些用法包括:可变参数函数、alloca 的使用、可变长度数据的使用类型(参见可变长度),...." gcc.gnu.org/onlinedocs/gcc/Inline.html
-
我认为这行不通。即使它是偶然发生的,这也是一种非常脆弱的编码方式。在“调用”函数中,编译器将期望独占其堆栈帧。因此,如果它决定在下一条指令中使用您精心安排的缓冲区,您将无法避免损坏。