【问题标题】:Function Increasing/Decreasing Stack Pointer based on integer基于整数的函数增加/减少堆栈指针
【发布时间】:2013-07-26 03:11:02
【问题描述】:

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

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

【问题讨论】:

标签: c++ c stack


【解决方案1】:

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

【讨论】:

  • 不赞成使用 malloca
【解决方案2】:

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

【讨论】:

  • 有道理,很好的链接!我认为它会 POP 好,但其他依赖它的实体也很有意义。我想与函数启动时使用原始位置相比有一些好处。
【解决方案3】:

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。这个想法是,如果可能的话,它们也应该在堆栈上分配(参见Why both runtime-sized arrays and std::dynarray in C++14?)。

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2020-01-03
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多