0

基本上我有一个函数,我想根据一个整数变量推送一定数量的堆栈空间。所以我可以让函数一次占用 3 个字节,然后再占用 5 或 6 个字节。我需要它在堆栈而不是堆上,有谁知道如何通过将程序集插入我的代码或其他东西来做到这一点?

void Bar::foo(int alloc){
   //allocate data on stack the size of alloc
}
4

3 回答 3

1

我相信alloca是您正在寻找的功能。

于 2013-07-26T01:20:33.750 回答
0

C99 以及(根据当前草案)C++14 提供动态数组,即自动存储数组,但运行时确定大小。

由于标准没有提到堆栈(至少没有在内存中预定位置的意义上),因此不能保证动态数组是在堆栈上分配的,但一般的理解是它们是。

例如,GCC 提供的实现保证了它: http: //gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

以下是如何使用动态自动数组char根据您的规范分配缓冲区:

#include <iostream>
#include <algorithm>

void foo(int alloc) {

  /* Allocate data on the stack, the size of `alloc`. */
  char c[alloc];

  /* Do something with the buffer. I fill it with 'a's. */
  std::fill(c,c+alloc,'a');

  /* And print it. */    
  for (int i = 0; i < alloc; ++i)
    std::cout << c[i];

  std::cout << std::endl;

}

int main()
{
  int alloc;
  std::cin >> alloc;
  foo(alloc);
  return 0;
}

(显然,如果您想使用此缓冲区存储大于 的对象char,您可能需要确保对齐,即您可能必须在缓冲区内移动几个字节才能获得正确对齐的地址。)


C++14 也可能为动态自动数组提供 C++ 风格的容器,std::dynarray. 这个想法是,如果可能的话,它们也应该在堆栈上分配(参见为什么在 C++14 中同时使用运行时大小的数组和 std::dynarray?)。

于 2013-07-26T01:54:58.250 回答
0

指针 = 指针 - 分配;// 是加号还是减号...?

于 2013-07-26T01:21:18.580 回答