【问题标题】:Determining stack size at runtime in a C++ Program在 C++ 程序中确定运行时的堆栈大小
【发布时间】:2016-07-15 18:15:39
【问题描述】:

我想知道是否有办法以编程方式确定 C++ 中正在运行的程序的堆栈大小。如果是这样,是否还有一种方法可以以编程方式确定程序在运行时使用了多少堆内存?为了确定堆的大小,我可以通过重载 newdelete 运算符看到一种潜在的方法,但我认为这不适用于智能指针。

我尝试通过以下方式实现它:

int main(){
    const char STACK_BEGIN = 'A';
    //a lot of code
    register unsigned long int STACK_NOW asm("%esp");
    long long int stack_size = (reinterpret_cast<int>(&STACK_BEGIN) - STACK_NOW);
    //rest of code
}

【问题讨论】:

  • 不,没有真正的标准方法可以做到这一点。不过,可能会有特定于操作系统的系统调用来获取该信息。
  • 我记得在 Windows 堆栈页面仅根据需要提交。这意味着指定大堆栈的成本只是稍微减少了地址空间,而不是实际的内存使用(也就是说,直到需要)。无论如何,通过使用标准集合(例如 std::vector)动态分配其缓冲区,您可以显着减少堆栈使用量。
  • 我认为您至少可以大致了解堆栈的使用情况,方法是在您的main() 例程中存储指向您在堆栈上声明的第一个变量的全局可访问指针,然后在运行期间的任何时间在程序的执行中,找出最近声明的堆栈变量的地址和该全局指针的值之间的差异。这是一种粗略的技术,但至少应该提供堆栈使用的概念。

标签: c++ stack runtime c++14


【解决方案1】:

我大概是这样解决的:

int main(){ 
    const char STACK_BEGIN = 'A'; //a lot of code 
    register unsigned long int STACK_NOW asm("%esp"); 
    long long int stack_size = (reinterpret_cast<int>(&STACK_BEGIN) - STACK_NOW); //rest of code 
}

【讨论】:

  • 知道为什么必须使用 x86 asm 而不是在堆栈上声明第二个字符并像使用 STACK_BEGIN 一样获取其地址吗?
【解决方案2】:

首先,栈是线程的一个属性,每个线程都有自己的栈。 由于线程是由平台提供的,系统接口可能提供也可能不提供信息。
对于 Linux,这是函数 pthread_attr_getstacksize()

如果您还想获得实际的地址范围,您可以从 STACK_BEGIN 和处理器体系结构约定中获得,即堆栈是自上而下的,即 STACK_BEGIN 实际上在顶部,底部大约在STACK_BEGIN-´size of the stack´

对于 Windows,堆栈范围隐藏在 GetThreadInformation(() 中,请参阅 processhacker

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 2010-12-13
    • 2015-02-13
    • 2010-12-22
    • 2015-08-14
    • 2016-08-26
    • 2017-09-05
    • 2017-11-21
    相关资源
    最近更新 更多