【发布时间】:2016-07-15 18:15:39
【问题描述】:
我想知道是否有办法以编程方式确定 C++ 中正在运行的程序的堆栈大小。如果是这样,是否还有一种方法可以以编程方式确定程序在运行时使用了多少堆内存?为了确定堆的大小,我可以通过重载 new 和 delete 运算符看到一种潜在的方法,但我认为这不适用于智能指针。
我尝试通过以下方式实现它:
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()例程中存储指向您在堆栈上声明的第一个变量的全局可访问指针,然后在运行期间的任何时间在程序的执行中,找出最近声明的堆栈变量的地址和该全局指针的值之间的差异。这是一种粗略的技术,但至少应该提供堆栈使用的概念。