【问题标题】:In C++, does initializing a string but not assigning it to anything result in memory usage? [duplicate]在 C++ 中,初始化字符串但不将其分配给任何东西会导致内存使用吗? [复制]
【发布时间】:2017-03-16 08:39:11
【问题描述】:

我正在尝试了解 const char * foo = "hello"; 的工作原理。我将其解释为创建了一个字符串,然后在内存中指向它的指针。

所以,这行代码:

"hello";

有什么记忆吗?

【问题讨论】:

  • 问题文字与标题相反

标签: c++


【解决方案1】:

如果您只是将"hello"; 作为表达式执行,几乎所有编译器都会(甚至可能禁用优化)将其优化为一无所有。

不过,这不一定与您的出发点相关。给定:

const char * foo = "hello";

您还有另一个问题需要考虑:是否在命名空间范围内(即,在任何函数之外)?如果它在全局范围内,编译器可能无法优化它,即使它没有被使用。问题很简单:如果它在任何函数之外,那么某些 other 源文件可能包含类似extern char const *foo; 的内容,并且通过这样做可以访问foo,即使它没有在当前文件。由于编译器一次只查看一个源文件,因此无法检测到这种情况。

根据它的智能程度,链接器(确实一次查看所有目标文件)可能能够检测到foo 从未使用过,并且基于此它可以优化它。

如果此定义在函数内部,那么编译器可以仅根据该函数的内容来检测它是否被使用,因此我们回到了可以更可靠地对其进行优化的情况。

【讨论】:

    【解决方案2】:

    我建议查看此链接:http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

    foo 在您的情况下指向堆栈上的一个位置。所以,是的,它会占用内存。

    编辑:抱歉误读了您的代码。你没有给任何东西分配“你好”。 所以在你的情况下,没有。

    【讨论】:

    • foo 在典型实现中可能存在于堆栈中,但在这些相同的实现中,它几乎肯定不会指向堆栈中的任何位置。
    【解决方案3】:

    有趣的问题。

    字符串文字必须在静态存储(“数据段”)中占用空间,所以是的,该字符串文字确实在进程内存中的某个位置。

    但是一个好的优化会认识到这个文字不是无处引用,并且可能会删除那个字符串。所以我非常怀疑使用优化编译的程序是否会保留该字符串。

    【讨论】:

    • 它可能在“代码段”(或任何地方)
    【解决方案4】:

    "hello";

    这不会占用任何内存,因为任何现代编译器都会优化它,因为它实际上什么都不做。如果它更像是:

    const char* foo = "hello";

    正如您在问题中所说,foo 将是一个 char* 到一个静态字符串,该字符串被烘焙到程序可执行文件中。因此,唯一的运行时内存是指向该字符串位置的指针。

    【讨论】:

    • 加载可执行文件时,静态数据可能会被映射或加载到内存中,例如指针实际上并不指向硬盘。
    猜你喜欢
    • 2021-04-24
    • 2020-04-06
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多