为什么 sizeof(std::string) 只有八个字节?

2023-12-13

Why is std::string的大小,由下式确定sizeof(std::string), yield 8?
我认为应该超过8因为它必须有一个int (sizeof(int) == 8在我的机器上)用于给予的数据成员std::string::length() and std::string::size()在 O(1) 中,并且可能是char*对于字符。


实施std::stringC++ 标准没有指定。它仅描述类的行为。然而,我希望类中会有不止一个指针的信息价值。尤其:

  • 指向实际字符串的指针。
  • 尺寸可用。
  • 实际使用的尺寸。

当然,它可以将所有这些存储在动态分配的位置中,因此占用与char*[在大多数架构中]。

事实上,查看我的 Linux 机器附带的 C++ 头文件,当您查看时,其实现非常清晰(根据评论,它是“C++11 之前的版本”,但我认为无论哪种方式都大致具有代表性):

  size_type
  length() const _GLIBCXX_NOEXCEPT
  { return _M_rep()->_M_length; }

然后按照以下步骤操作:

  _Rep*
  _M_rep() const _GLIBCXX_NOEXCEPT
  { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }

这又导致:

  _CharT*
  _M_data() const _GLIBCXX_NOEXCEPT
  { return  _M_dataplus._M_p; }

这导致

  // Data Members (private):
  mutable _Alloc_hider  _M_dataplus;

然后我们就可以:

  struct _Alloc_hider : _Alloc
  {
    _Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
    : _Alloc(__a), _M_p(__dat) { }

    _CharT* _M_p; // The actual data.
  };

有关字符串的实际数据是:

  struct _Rep_base
  {
    size_type       _M_length;
    size_type       _M_capacity;
    _Atomic_word        _M_refcount;
  };

所以,这都是一个简单的指针,称为_M_p隐藏在几层吸气剂和一些铸造里面......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 sizeof(std::string) 只有八个字节? 的相关文章

  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 从结构调用 C++ 成员函数指针

    我找到了有关调用 C 成员函数指针和调用结构中的指针的信息 但我需要调用结构内部存在的成员函数指针 但我无法获得正确的语法 我在类 MyClass 的方法中有以下代码片段 void MyClass run struct int MyClas
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • Adobe Illustrator 中的折线简化如何工作?

    我正在开发一个记录笔划的应用程序 您可以使用定点设备来绘制笔划 在上图中 我绘制了一个笔划 其中包含 453 个数据点 我的目标是大幅减少数据点的数量 同时仍然保持原始笔画的形状 对于那些感兴趣的人 上图笔画的坐标可以作为GitHub 上的
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • CSS:在不改变容器大小的情况下将某些文本加粗

    我有一个水平导航菜单 它基本上只是一个 ul 元素并排设置 我不定义宽度 而只是使用填充 因为我希望宽度由菜单项的宽度定义 我将当前选定的项目加粗 问题在于 在加粗时 单词会变得稍微变宽 这会导致其余元素稍微向左或向右移动 有什么聪明的方法
  • 是否可以在 RAM 中执行一些计算?

    理论上 有没有办法使用内存相关指令 例如move clflush或其他任何东西 例如xor例如 在两个相邻行之间 由于我对 RAM 和汇编的了解有限 我无法想到任何这样的可能性 不 任何计算都是在 CPU 或 GPU 或其他可以加载 存储到
  • SAS PRX 请提取子字符串

    我正在尝试使用 SAS PRX 函数从我的数据集中提取子字符串 但它只返回精确的匹配项 而我需要它更加灵活并提取匹配各种条件的匹配项 我已将我的数据复制到下面 如您所见 我的数据中的变量之一是 brandmodel 其中包含特定相机的品牌名
  • 如何使用annotation_custom()将GROB放置在绘图区域的精确区域?

    我正在尝试使用以下命令重现以下 base R 图ggplot2 我已经完成了大部分工作 但目前令我困惑的是连接图右侧边缘地毯图的线段的位置以及相应的标签 标签已通过以下方式绘制 在下面的第二张图中 anotation custom 我已经使
  • JavaFX 打包:NoClassDefFoundError

    我使用 maven 和 OpenJDK 1 8 打包 JavaFX 应用程序 我的 pom xml 中的相关部分
  • 如何为终端制作动画 bash shell 提示符?

    我想在终端中制作动画光标提示 Ubuntu 14 04 所以我制作这个脚本 while do echo ne r sleep 0 3 echo ne r sleep 0 3 echo ne 一 r sleep 0 3 echo ne r s
  • 从base64字符串获取图像尺寸

    我收到图像的 base64 字符串并将其用作 html 页面的源 反过来 img 是 div 的子级 我想让 div 根据图像尺寸自动调整大小 尝试使用 javascript element style height 获取图像的尺寸 但它不
  • 什么是烫发空间?

    在学习 Java 内存分析时 除了 堆 之外 我还不断看到术语 永久空间 我知道堆是什么 什么是 Perm 空间 它代表永久代 永久代很特殊 因为它包含描述的元数据 用户类别 不是的类别 Java 语言的一部分 例子 这些元数据的一部分是对
  • Glassfish 在哪里将类加载器委托选项设置为 false

    我有一个 Web 应用程序 在 glassfisch 3 1 2 上运行 我遇到了 ClassCastException 我想尝试通过将类加载器委托设置为 false 来解决它们 我无法弄清楚在哪里 什么文件 插入以下 xml 标记
  • PHP 根据另一个数组中的文本重复项求和数组值

    我有两个数组 两个数组的计数长度始终相同 第一个具有与整数混合的双精度值 第二个具有文本 仅字符串 值 它们确实相关 所以我需要它们都保持有序 抱歉 没有可用的键 按设计 我需要对包含字符串的数组中重复的值进行求和 Example data
  • Visual Basic 如何读取 CSV 文件并在数据网格中显示值?

    我正在使用 VB 2005 如何打开 CSV 文件并读取列 行并在数据网格中显示值 CSV 文件示例 杰史密斯 电子邮件受保护 然后我想对每一行 即每个用户 执行一个操作 我该怎么做 正如你所知 我是一个新手 但很乐意学习 Thanks U
  • React - TypeError:无法读取未定义的属性“图像”

    所以我正在为一个副项目创建一个电子商务商店 但我遇到了一个问题 在主页上我有所有产品 并且我已经为产品详细信息创建了一条路线 当我点击其中之一时 它会获取 id 并应输出所有产品详细信息 我在 JSON 数组 data js 中有有关产品的
  • 使用具有多个条件的sql获取总和

    我的列中的数据为 Process Volume TAT 1 1 Pass 1 2 Fail 2 5 Fail 2 5 Pass 3 1 Pass 4 6 Fail 4 4 Pass 现在按流程分组 我想要体积总和 不考虑任何 TAT TAT
  • 对当前行号着色

    我在用global linum mode对于行号 如果当前行的行号用不同的颜色 和 或不同的背景 突出显示 那就太好了 有人知道如何实现这一目标吗 谢谢你 我从之前的回答中得出了这个答案Emacs 中的相对行号 因为它处理在 linum 格
  • 什么时候应该在 C# 4.0 中使用动态关键字?

    什么时候应该在 c 4 0 中使用动态关键字 c 4 0 中任何带有动态关键字的好例子可以解释其用法 只能使用动态不使用时会很痛苦 就像 MS Office 库一样 在所有其他情况下 应该避免它 因为编译类型检查是有益的 以下是使用动态的良
  • nuget 包中的 .targets 文件 - 如何将内容文件包含到构建中

    我有一个 nuget 包 例如 build SharedTargets targets content File cs SharedTargets targets 看起来像
  • Famo.us 引擎中提供哪些活动

    我想知道 Famo us 引擎对象可以订阅哪些事件 来自 Famo us大学 引擎还会发出某些事件 例如 预渲染 和 后期渲染 然而 由于这些事件的频繁发生 他们 仅应在绝对必要时使用 还有其他方便的引擎事件 即 调整大小 那么 引擎发出的
  • Azure 和 Node js __dirname

    可能它与 webpack memory fs 没有特别相关 但我得到了RangeError Maximum call stack size exceeded错误 请参阅下面的调用堆栈 我发现 那 dirname在 Azure webapp
  • 没有为类“Object?”定义运算符“[]”

    班图 萨亚 温图克 梅梅卡坎 玛萨拉 迪巴瓦 伊尼 import package cloud firestore cloud firestore dart class UserModel static const NUMBER number
  • 为什么 sizeof(std::string) 只有八个字节?

    Why is std string的大小 由下式确定sizeof std string yield 8 我认为应该超过8因为它必须有一个int sizeof int 8在我的机器上 用于给予的数据成员std string length an