C++ 中的全局对象

2024-04-29

在下面的C++代码中,s分配在哪里?它使用堆、数据、bss 还是某种组合?我使用的是 Linux/x86 平台,以防产生影响。有没有办法让 g++ 编译器向我显示布局?

#include <string>
#include <iostream>

using namespace std;

string s;

int main()
{
    s = "test";
    cout << s;
}

C++ 标准没有定义编译器将此类对象放置在何处,但在 UNIX 上,可以合理地认为字符串数据可以是:

  • 在 BSS 上,默认构造函数在 main() 之前运行
  • 在 BSS 上,编译器已确定即使默认构造函数运行,所有成员也将为 0,因此根本不运行构造函数
  • 在数据段中,默认构造函数在 main() 之前运行
  • 在数据段中,成员变量的初始值由编译器计算出来并直接写入二进制映像

鉴于 std::string 的实现和成员未定义,通常不清楚在默认初始化后是否有任何成员最终应为非 0,这就是为什么有如此多的可能性。

在没有优化的情况下使用 GCC 在 Linux 上进行编译,然后使用“nm -C”检查可执行文件,我碰巧在 BSS 上有“s”。

 ~/dev  nm -C bss | grep ' s$'
08048896 t global constructors keyed to s
08049c98 B s

man nm

...
       "B" The  symbol  is  in  the  uninitialized data section (known as
           BSS).

虽然静态字符串对象永远不在堆上,但如果为字符串分配的文本对于任何(可选)内部缓冲区来说太大,则它们包含的一个或多个指针最终可能会指向堆上的内存。同样,没有具体的规则规定他们不会为其他目的分配堆内存,或者即使堆仍然为空也不会为文本内容预先分配堆内存(但这将是相当愚蠢的)。

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

C++ 中的全局对象 的相关文章

随机推荐

  • 如何让 MediaRouteSelector 显示可用的 MiraCast 和 Chromecast 设备?

    我正在尝试让我的媒体路由选择器同时显示 MiraCast 和 Chromecast 设备 我有一个 Chromecast 接收器应用程序 并且还使用 Android 中的演示 API 因此理想情况下 用户只需单击媒体路由器按钮并选择他们拥有
  • bash:PWD 和 CURDIR 有什么区别?

    我的问题 我使用 Makefile 来运行docker runtarget 需要当前工作目录作为其参数之一 我使用任一 PWD or CURDIR build Dockerfile docker run lt PWD or CURDIR g
  • 如何在 .NET 4+ 中实现 ISerialized 而不违反继承安全规则?

    背景 野田时间 https nodatime org包含许多 可序列化的结构 虽然我不喜欢二进制序列化 但我们 早在 1 x 时间线中就收到了许多支持它的请求 我们通过实施ISerializable界面 我们最近收到了一份问题 报告 htt
  • 如何从一个端口为 Jetty 提供 https 和 http 服务?

    我知道这是一个重复的问题 但原始发帖者提出这个问题的原因是错误的 我并不是暗示我问它是为了right原因 但让我们看看 我们有一个在非标准端口号上运行的 Web 服务 尽管用户似乎能够记住端口号 但有时他们会错误地输入 http 而不是 h
  • C# 和 .NET 的“最佳”数据访问框架/方法是什么?

    编辑 我将其设为社区维基 因为它更适合协作格式 有多种方法可以从 NET 访问 SQL Server 和其他数据库 一切都有其优点和缺点 这永远不会是一个简单的问题 哪个是 最好的 答案永远是 这取决于 然而 我正在寻找在不同级别的系统背景
  • Meyers 的单例实现实际上是如何实现单例的

    我读了很多关于单例的内容 什么时候应该使用它们 什么时候不应该使用它们 以及如何安全地实现它们 我正在用 C 11 编写 并且遇到了 Meyer 的单例延迟初始化实现 如所示这个问题 https stackoverflow com ques
  • Typescript 使用装饰器获取参数值

    如何访问装饰器中方法参数的值 export const NullParameterCheck target Object key string index number gt how to get the value of the mark
  • distutils:如何将用户定义的参数传递给setup.py?

    如何将用户定义的参数从命令行和 setup cfg 配置文件传递到 distutils 的 setup py 脚本 我想编写一个 setup py 脚本 它接受我的包特定参数 例如 python setup py install foo m
  • 如何为 HTTP GET 的多个 Key-Value 参数设计 REST URI

    我正在设计一个 RESTful API 一项服务应该提供多个键值对的查询功能 例如 客户端可以使用一个 HTTP GET 请求来查询不同的产品及其关联的数量 客户想要查询金额为 44 的产品 1 和金额为 55 的产品 2 我实际上不希望我
  • 文件系统和 Memcached 哪个缓存更快/更好?

    我认为我还不清楚 从文件或从 memcached 读取内容更快吗 为什么 Memcached 速度更快 但内存有限 HDD 很大 但 I O 速度比内存慢 你应该把memcached 最热门的东西 and 所有其他人 can go 缓存文件
  • 处理异常后如何从上次尝试的指令继续执行帧?

    我想处理一个NameError通过将所需的缺失变量注入到帧中 然后从上次尝试的指令继续执行来抛出异常 下面的伪代码应该可以说明我的需求 def function return missing var try print function e
  • 循环时,.iter() 与引用 (&) 有何不同?

    在玩 Rust 时 我发现你可以循环Vecs and HashMaps 可能还有其他 通过引用 而不是使用 iter let xs vec 1 2 3 4 5 for x in xs println x x The iter 函数似乎具有相
  • 如何在 Javascript 中的小数点后附加一个额外的“零”

    嘿 我是 JavaScript 新手 使用一个文本框验证十进制数字 示例格式应为 66 00 但是如果用户键入 66 0 并且不在逗号后键入两个零 则在离开文本框后 它应该自动附加到它 这样它就是正确的格式 我怎样才能得到这个 我怎样才能追
  • 为什么当设置为 TLS 选择器时,ES 和 DS 在 64 位内核上最终会归零?

    下面的 32 位程序调用set thread area 2 http linux die net man 2 set thread area在 GDT 中创建一个条目 该条目旨在用于 TLS 通常将结果选择器放入FS or GS并成功使用
  • 从 PHP 启动交互式 SSH bash 会话

    我正在使用 PHP 编写常见服务器管理任务的快捷方式 我正在使用deployer org 但这应该不重要 我想添加一个任务 用于在通过 SSH 连接到服务器后启动交互式 bash 提示符 例如 您将运行 dep ssh 其中 dep 是一个
  • 在 phpunit 中 __construct 与 setup 之间有什么区别?

    我很想知道在测试类 construct 中创建对象是一种很好的做法 或者我们应该始终使用 setup teardown 方法 或 setUpBeforeClass tearDown AfterClass 方法 我知道每个测试都会调用 set
  • 在 Web API 2 中返回字符串

    听起来很简单 我还没有找到任何关于这方面的文档 也许我的措辞是错误的 所以如果是这样 一些关于这方面的好的文档将不胜感激 我只想返回一个字符串或字符串类型的模型 return string here 我每次都会收到此错误 Severity
  • 可基于多列格式化

    我正在使用该包formattable生成格式化表格 我发现了一个不错的资源在 R 中设置表格格式 http www r bloggers com formatting table output in r 但这里的箭头格式示例仅基于特定列 我
  • Windows 从属设备上的 Jenkins Git SSH 密钥

    目前 我们在 Windows 上有一个 Jenkins 主服务器 一个 ubuntu 从服务器和一个 Windows 从服务器 我正在尝试在 Windows 从机上设置 git msysgit 已安装 并且我将该目录包含在系统路径变量中 以
  • C++ 中的全局对象

    在下面的C 代码中 s分配在哪里 它使用堆 数据 bss 还是某种组合 我使用的是 Linux x86 平台 以防产生影响 有没有办法让 g 编译器向我显示布局 include