C++ 在C++;,初始化字符串但不将其分配给任何对象是否会导致内存使用?
我试图理解如何C++ 在C++;,初始化字符串但不将其分配给任何对象是否会导致内存使用?,c++,C++,我试图理解如何const char*foo=“hello”在引擎盖下工作。我将其解释为创建了一个字符串,然后在内存中有一个指针指向它 那么,这行代码: “你好” 有内存吗?我建议查看以下链接: foo指向您案例中堆栈上的一个位置。所以,是的,它会占用内存 编辑:抱歉误读了你的代码。你没有给任何东西指定“你好”。 因此,在您的情况下,没有。“你好” 这不会占用任何内存,因为任何现代编译器都会优化它,因为它实际上什么也不做。如果它更像: const char*foo=“你好” 正如您在问题中所述,f
const char*foo=“hello”代码>在引擎盖下工作。我将其解释为创建了一个字符串,然后在内存中有一个指针指向它
那么,这行代码:
“你好”代码>
有内存吗?我建议查看以下链接:
foo指向您案例中堆栈上的一个位置。所以,是的,它会占用内存
编辑:抱歉误读了你的代码。你没有给任何东西指定“你好”。
因此,在您的情况下,没有。“你好”代码>
这不会占用任何内存,因为任何现代编译器都会优化它,因为它实际上什么也不做。如果它更像:
const char*foo=“你好”代码>
正如您在问题中所述,foo
将是烘焙到程序可执行文件中的静态字符串的char*
。因此,唯一的运行时内存是指向该字符串位置的指针。有趣的问题
字符串文字必须在静态存储器(“数据段”)中占有空间,因此,是的,该字符串文字确实在进程内存中的某个位置占有一席之地
但是一个好的优化将认识到这个文本不是无引用的,并且可能会删除该字符串。因此,我非常怀疑在上进行优化编译的程序是否会保留该字符串。如果您只是执行“hello”
作为一个表达式,几乎任何编译器都会(甚至可能在禁用优化的情况下)将其优化为零
但这并不一定与你的出发点有关。鉴于:
const char * foo = "hello";
您还需要考虑另一个问题:它是否在名称空间范围内(即,在任何函数之外)?如果它在全局范围内,编译器可能无法优化它,即使它没有被使用。问题很简单:如果它在任何函数之外,那么其他一些源文件可能包含类似extern char const*foo代码>,这样就可以访问foo
,即使当前文件中没有使用它。由于编译器一次只查看一个源文件,因此无法检测这种情况
根据它的智能程度,链接器(一次查看所有对象文件)可能能够检测到从未使用过foo
,并基于此对其进行优化
如果此定义在函数中,那么编译器可以检测它是否仅基于该函数的内容使用,因此我们回到了可以更可靠地对其进行优化的情况。问题文本与标题foo
在典型实现中可能存在于堆栈上,但在这些相同的实现中,它几乎肯定不会指向堆栈中的任何地方。它可能位于“代码段”(或真正的任何位置)中。加载可执行文件时,静态数据可能会映射或加载到内存中,例如,指针实际上并不指向硬盘。