在Windows上,我可以像这样从Thread Information Block获取堆栈边界:
void *stackBottom,
*stackTop;
#if defined _MSC_VER
void **teb = (void **)NtCurrentTeb();
stackBottom = teb[2];
stackTop = teb[1];
#else
#error "unsupported platform"
#endif
...或使用GetCurrentThreadStackLimits()。但是GetCurrentThreadStackLimits()不会返回当前分配的堆栈的边界(Windows会过量使用堆栈),而是返回堆栈的整个地址范围,直至最终可能扩展到的位置。
在Linux上是否可以实现上述类似的功能?
[编辑]我知道了:
#include <iostream>
#include <pthread.h>
using namespace std;
int main()
{
pthread_attr_t attrs;
if( pthread_getattr_np( pthread_self(), &attrs ) != 0 )
return -1;
void *stackAddr;
size_t stackSize;
if( pthread_attr_getstack( &attrs, &stackAddr, &stackSize ) != 0 )
return -1;
cout << "stack-address: " << stackAddr << endl;
cout << "stack-size: " << stackSize << endl;
cout << "var-addr: " << (void *)&stackAddr << endl;
}
这确定堆栈的基地址及其大小。如var_addr所示,stackAddr是下限,即堆栈从(char *)stackAddr + stackSize开始。接下来要做的就是确定代码的性能。