首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::wstring().capacity()不等于std::wstring().capacity()?

为什么std::wstring().capacity()不等于std::wstring().capacity()?
EN

Stack Overflow用户
提问于 2022-02-01 19:14:15
回答 2查看 757关注 0票数 13

我不知道我是太天真还是太不知情。

但是,为什么下面的区别呢?

代码语言:javascript
复制
constexpr auto nInitialCapacity1 = std::wstring().capacity();
const auto     nInitialCapacity2 = std::wstring().capacity();

在Visual 2022/17.0.5中,上述代码的结果如下:

代码语言:javascript
复制
nInitialCapacity1 = 8
nInitialCapacity2 = 7

为什么constexpr (编译时)版本的结果不等于调用的const版本?

谢谢你的解释!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-01 19:39:36

微软的STL 在常量计算上下文中禁用短字符串优化。,因此它分配内存。

分配总是大于2的幂,所以容量(不包括最后的L'\0')总是2的幂。

在非常量计算版本中,短字符串缓冲区可以容纳8个字符,其中一个是L'\0',因此容量为7。

票数 21
EN

Stack Overflow用户

发布于 2022-02-03 11:10:02

通过新的经验和观察更新:

  • 反汇编窗口的内容显示,const-调用to std::wstring::capacity的结果是8
  • 但是,监视窗口和变量的工具提示显示了7

同事的假设是,调试器调用constexpr方法容量为non,得到7的不同结果并将其可视化。

查看反汇编窗口的原因之一是下列代码中的意外行为:

代码语言:javascript
复制
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;

调试器显示的变量如下:

代码语言:javascript
复制
nInitCap: 7
nCap:     7

但代码打印出来:

容量7不等于初始容量7。

对const构造的临时对象的容量调用返回8,在反汇编中可以看到,因此行为是可以解释的,即使VS2022 17.0.5的调试器显示7

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70946223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档