我不知道我是太天真还是太不知情。
但是,为什么下面的区别呢?
constexpr auto nInitialCapacity1 = std::wstring().capacity();
const auto nInitialCapacity2 = std::wstring().capacity();在Visual 2022/17.0.5中,上述代码的结果如下:
nInitialCapacity1 = 8
nInitialCapacity2 = 7为什么constexpr (编译时)版本的结果不等于调用的const版本?
谢谢你的解释!
发布于 2022-02-01 19:39:36
微软的STL 在常量计算上下文中禁用短字符串优化。,因此它分配内存。
分配总是大于2的幂,所以容量(不包括最后的L'\0')总是2的幂。
在非常量计算版本中,短字符串缓冲区可以容纳8个字符,其中一个是L'\0',因此容量为7。
发布于 2022-02-03 11:10:02
通过新的经验和观察更新:
to std::wstring::capacity的结果是8!同事的假设是,调试器调用constexpr方法容量为non,得到7的不同结果并将其可视化。
查看反汇编窗口的原因之一是下列代码中的意外行为:
const auto nInitCap = std::wstring().capacity();
const auto nCap = str.capacity();
if (nCap != nInitCap)
std::wcout << "capacity " << nCap << "is not equal to the initial capacity " << nInitCap << std::endl;
if (nCap > nInitCap)
std::wcout << "capacity " << nCap << "is greater than the initial capacity " << nInitCap << std::endl;调试器显示的变量如下:
nInitCap: 7
nCap: 7但代码打印出来:
容量7不等于初始容量7。
对const构造的临时对象的容量调用返回8,在反汇编中可以看到,因此行为是可以解释的,即使VS2022 17.0.5的调试器显示7
https://stackoverflow.com/questions/70946223
复制相似问题