C++ 多次调用alloca()会导致堆栈的连续部分吗?

C++ 多次调用alloca()会导致堆栈的连续部分吗?,c++,memory-management,callstack,C++,Memory Management,Callstack,如果alloca()函数在一个特定函数中被多次调用,是否可以保证由它分配的所有堆栈段构成堆栈内存的一个连续部分?可能。C、C++或POSIX中没有 ALOLACA。它是 在基于Unix的系统中经常使用的扩展,但每个系统 像它想要的那样定义它。(GNU版本的文档 表明它们将是相邻的,但我看不到实际的 保证。) 是否保证由它分配的所有堆栈段构成堆栈内存的一个连续部分 不。如果有保证的话,你可以在它的文档中阅读所有关于它的信息alloca是一个实现定义的函数(只有编译器的实现者才能告诉您对它有什么保证

如果alloca()函数在一个特定函数中被多次调用,是否可以保证由它分配的所有堆栈段构成堆栈内存的一个连续部分?

可能。C、C++或POSIX中没有<代码> ALOLACA</代码>。它是 在基于Unix的系统中经常使用的扩展,但每个系统 像它想要的那样定义它。(GNU版本的文档 表明它们将是相邻的,但我看不到实际的 保证。)

是否保证由它分配的所有堆栈段构成堆栈内存的一个连续部分

不。如果有保证的话,你可以在它的文档中阅读所有关于它的信息
alloca
是一个实现定义的函数(只有编译器的实现者才能告诉您对它有什么保证)

它也是非标准、不安全和不可移植的(基本上比在C++中使用
malloc
free
更糟糕)


除非您想知道遗留代码(使用它)的行为,否则您使用它所得到的唯一想法是较低的代码质量。

正如其他人所说,简短的答案是“不”

然而,阅读实施者文档甚至逆向工程都可以让你做出这样的假设(或者不)

我运行了这个例子,上面说
void*
的大小是8,而diff是(-32):

//示例程序
#包括
#包括
#包括
#包括
int main()
{
void*var1=alloca(var1的大小);

STD::CUT注意到 AlOrthAube()/Cuffe >是非标准的,在C++中可能没有什么理由使用它。不要使用<代码> AlOLAL(),请参阅@ OLICHARESLVEST。使用<代码> AlLoga < /C> >的主要原因是,即使使用 LojJMP < /C> >返回,也可以确保内存释放。当然,在C++中,不应该使用<代码> LojMP(/Cord<)>代码,因为它在解压缩堆栈时不调用析构函数。
// Example program
#include <iostream>
#include <string>
#include <alloca.h>
#include <stdint.h>

int main()
{
  void *var1 = alloca(sizeof var1);
  std::cout << "sizeof var1: " << sizeof var1 << std::endl;
  std::cout << "var1 addr: " << var1 << std::endl;
  void *var2 = alloca(sizeof var2);
  std::cout << "var2 addr: " << var2 << std::endl;
  intptr_t diff = (intptr_t)var2 - (intptr_t)var1;  
  std::cout << "addr diff: " << diff << std::endl;
}
// Example program
#include <iostream>
#include <string>
#include <alloca.h>
#include <stdint.h>

int main()
{
  int size = 128;
  void *var1 = alloca(size);
  std::cout << "var1 addr: " << var1 << std::endl;
  void *var2 = alloca(size);
  std::cout << "var2 addr: " << var2 << std::endl;
  intptr_t diff = (intptr_t)var2 - (intptr_t)var1;  
  std::cout << "addr diff: " << diff << std::endl;
}