Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;,初始化字符串但不将其分配给任何对象是否会导致内存使用?_C++ - Fatal编程技术网

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
在典型实现中可能存在于堆栈上,但在这些相同的实现中,它几乎肯定不会指向堆栈中的任何地方。它可能位于“代码段”(或真正的任何位置)中。加载可执行文件时,静态数据可能会映射或加载到内存中,例如,指针实际上并不指向硬盘。