Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象方法中的常量是否存在于堆栈中?_C++_Performance - Fatal编程技术网

C++ 对象方法中的常量是否存在于堆栈中?

C++ 对象方法中的常量是否存在于堆栈中?,c++,performance,C++,Performance,考虑类CameraTab void CameraTab::onFocusWheelTick(int delta) { const int lut[]={0,1,3,6,8,16,32,62,901202405007009001000}; const int lut_len=sizeof(lut)/sizeof(lut[0]); ... } 该类的所有实例是否共享相同的lut[]数组?是否在每个方法调用栈中创建和销毁?< /p> < p>以迂腐C++术语来回答:每个C++编译器都可以自由地进行任

考虑类
CameraTab

void CameraTab::onFocusWheelTick(int delta)
{
const int lut[]={0,1,3,6,8,16,32,62,901202405007009001000};
const int lut_len=sizeof(lut)/sizeof(lut[0]);
...
}

该类的所有实例是否共享相同的
lut[]
数组?是否在每个方法调用栈中创建和销毁?< /p> < p>以迂腐C++术语来回答:每个C++编译器都可以自由地进行任何没有可观察到的差异的优化。您的问题是:这种优化是否没有明显的差异?乍一看,在静态范围内构造数组和变量(仅一次)似乎没有明显的差异。它不能被修改。总是一样的。那么,为什么不呢

但它确实有一个潜在的明显差异。它是数组的地址,或指向数组的指针。C++中的指针具有特定的语义要求,特别是关于它们的总顺序,由比较函数对象实现。对于不同的执行线程,甚至是递归调用此函数的单个执行线程,这些变量的逻辑实例也会不同。如果在静态范围内构造这些对象,则指向这些对象的指针将是相同的。这将违反他们的相对总订单要求

这是一个明显的区别。因此,除非编译器能够从逻辑上证明指向这些对象的多个实例的指针永远不存在,否则编译器别无选择,只能在自动作用域(堆栈上)中构造它们


如果您的编译器能够证明您的程序中没有明显的差异:编译器可以进行任何此类优化,但不是必需的,因此您的对象是在静态范围内构造还是在自动范围内构造将完全由编译器决定。

因为数据是恒定的,编译器可以将数据放在可执行文件的“常量”部分中。取决于编译器和优化设置。事实是在汇编语言中。测试它。创建一个常量和一个非常量变量并打印它们的地址。这是一个好主意@JosephLarson我会做一些测试并打印contants地址。