【问题标题】:Can we do this with GCC's inline functions?我们可以用 GCC 的内联函数来做到这一点吗?
【发布时间】:2015-06-20 19:47:58
【问题描述】:

据我所知,内联函数是在调用者中替换的代码,这意味着内联函数中编写的任何代码都存在于最后一个函数的堆栈帧中。我碰巧处于需要动态分配内存而不使用malloc的情况。那么,有没有办法让我在内联函数中分配一个可变长度数组,并在函数终止时保持它——你知道,因为堆栈并没有真正展开。

谢谢!

编辑:

我有一个在信号处理程序上下文中调用的函数,由 sigpoll 激活。它尝试从 tcp 套接字读取数据。它读取的数据被组织成我们想出的数据结构;如果你愿意的话,人造“数据包”。不知道缓冲区中有多少数据,“数据包”边界在哪里等。它由信号处理程序调用,因此我们不能使用任何动态内存分配器。

【问题讨论】:

  • 如果您不想在线程的函数堆栈框架 (alloca) 或进程堆 (malloc) 上分配,那么剩下的就是直接的页面 (mmap)。或者:拥有自己的全局内存池(堆或页面)并从那里分配。但也许您可以就您实际想要实现的目标提供更多背景信息?
  • 你的意思是,当 inline 函数终止时数组保持不变,而当外部函数终止时数组是空闲的?
  • 是否需要内联函数,即它们是否从函数内的多个位置调用?能否将alloca'ed 缓冲区传递给内联函数?
  • 我认为答案是否定的。 GCC 手册没有完全解决您的情况,但它非常接近:“请注意,函数定义中的某些用法可能使其不适合内联替换。这些用法包​​括:可变参数函数、alloca 的使用、可变长度数据的使用类型(参见可变长度),...." gcc.gnu.org/onlinedocs/gcc/Inline.html
  • 我认为这行不通。即使它是偶然发生的,这也是一种非常脆弱的编码方式。在“调用”函数中,编译器将期望独占其堆栈帧。因此,如果它决定在下一条指令中使用您精心安排的缓冲区,您将无法避免损坏。

标签: c gcc stack inline


【解决方案1】:

嗯。这似乎是您想要的另一个方面。调用所有alloca函数分配堆栈内存。 alloca() - 函数终止时分配的内存消失。它返回一个指针

有关详细信息,请参阅此内容。另请注意,使用 alloca 可能会导致一些其他问题,因此并不完美。

http://man7.org/linux/man-pages/man3/alloca.3.html

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 2011-09-15
    • 2015-04-11
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多