【发布时间】:2017-03-16 08:39:11
【问题描述】:
我正在尝试了解 const char * foo = "hello"; 的工作原理。我将其解释为创建了一个字符串,然后在内存中指向它的指针。
所以,这行代码:
"hello";
有什么记忆吗?
【问题讨论】:
-
问题文字与标题相反
标签: c++
我正在尝试了解 const char * foo = "hello"; 的工作原理。我将其解释为创建了一个字符串,然后在内存中指向它的指针。
所以,这行代码:
"hello";
有什么记忆吗?
【问题讨论】:
标签: c++
如果您只是将"hello"; 作为表达式执行,几乎所有编译器都会(甚至可能禁用优化)将其优化为一无所有。
不过,这不一定与您的出发点相关。给定:
const char * foo = "hello";
您还有另一个问题需要考虑:是否在命名空间范围内(即,在任何函数之外)?如果它在全局范围内,编译器可能无法优化它,即使它没有被使用。问题很简单:如果它在任何函数之外,那么某些 other 源文件可能包含类似extern char const *foo; 的内容,并且通过这样做可以访问foo,即使它没有在当前文件。由于编译器一次只查看一个源文件,因此无法检测到这种情况。
根据它的智能程度,链接器(确实一次查看所有目标文件)可能能够检测到foo 从未使用过,并且基于此它可以优化它。
如果此定义在函数内部,那么编译器可以仅根据该函数的内容来检测它是否被使用,因此我们回到了可以更可靠地对其进行优化的情况。
【讨论】:
我建议查看此链接:http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/
foo 在您的情况下指向堆栈上的一个位置。所以,是的,它会占用内存。
编辑:抱歉误读了您的代码。你没有给任何东西分配“你好”。 所以在你的情况下,没有。
【讨论】:
foo 在典型实现中可能存在于堆栈中,但在这些相同的实现中,它几乎肯定不会指向堆栈中的任何位置。
有趣的问题。
字符串文字必须在静态存储(“数据段”)中占用空间,所以是的,该字符串文字确实在进程内存中的某个位置。
但是一个好的优化会认识到这个文字不是无处引用,并且可能会删除那个字符串。所以我非常怀疑使用优化编译的程序是否会保留该字符串。
【讨论】:
"hello";
这不会占用任何内存,因为任何现代编译器都会优化它,因为它实际上什么都不做。如果它更像是:
const char* foo = "hello";
正如您在问题中所说,foo 将是一个 char* 到一个静态字符串,该字符串被烘焙到程序可执行文件中。因此,唯一的运行时内存是指向该字符串位置的指针。
【讨论】: