声明变量是指令吗 在高级语言中声明/赋值变量,如C++、显式指令?< /P>

声明变量是指令吗 在高级语言中声明/赋值变量,如C++、显式指令?< /P>,c++,C++,e、 g.x=5 它将由加载程序处理,并作为状态信息处理,对吗 它不是一条指令,而是一个状态对象,与类似for循环的东西相反,for循环是一条指令,它通向cpu 编辑:好的,再澄清一点。我不是说优化。假设没有。我说的是以可执行文件格式编译的程序的最终结果。在编译器决定不使用MOV指令的情况下,数据5会存在于可执行文件数据段中,还是其他地方 5是否可能作为数据存在,而不是作为指令存在,并且该数据稍后加载到内存中?或者,一般来说,当程序执行时,x=5会导致mov指令。这取决于它的使用方式 一般来说,

e、 g.x=5

它将由加载程序处理,并作为状态信息处理,对吗

它不是一条指令,而是一个状态对象,与类似for循环的东西相反,for循环是一条指令,它通向cpu

编辑:好的,再澄清一点。我不是说优化。假设没有。我说的是以可执行文件格式编译的程序的最终结果。在编译器决定不使用MOV指令的情况下,数据5会存在于可执行文件数据段中,还是其他地方


5是否可能作为数据存在,而不是作为指令存在,并且该数据稍后加载到内存中?或者,一般来说,当程序执行时,x=5会导致mov指令。

这取决于它的使用方式

一般来说,编译器会尽力使每一行的影响尽可能小

如果这只在一个地方使用,您可以打赌它是在机器代码中硬编码的,而不是在堆栈上浪费空间

如果它用于数学或算法运算,并且其值可能会更改,则可以在堆栈上为变量分配空间。然后,如果它使用得足够频繁,编译器可能会将其保留在寄存器中

答案是:视情况而定。编译它并使用调试器的机器代码窗口查看结果

一种可能的实际翻译:

MOV AX, 5

您是否在询问变量声明是否会像add或delete一样转换为汇编指令?如果是这样的话,那么一般的答案是没有直接翻译成汇编

可能有一些指令有助于变量的声明,例如更新堆栈指针以为变量留出空间。但是没有x86汇编指令在堆栈上声明这种类型的变量

我的大部分经验都是使用x86和amd64芯片的,因此其他处理器上可能会有指令,但我不知道它们(但如果它们确实存在的话,我很想了解它们)


变量赋值有点不同。一般情况下,x=5的情况将转换为某种类型的汇编指令(例如,将值写入寄存器)。然而,C++是很难具体的,因为有很多优化和特定于芯片的设置可能导致特定的行在机器代码中没有翻译。p> 在汇编语言中,mov指令通常用于将5加载到表示x的寄存器、堆栈变量或堆变量中

但是优化器可以决定只将其用作常量值(如#define),或者如果未使用它,它可以决定将其完全删除,并决定将其放置在何处(寄存器、堆栈变量、堆)

我希望它能回答你的问题,但是正如你所看到的,在C++中赋值一个变量是很重要的。p> 仅供参考:我已经研究了大量的编译器汇编输出。 在这篇文章中,分配操作优化为一个程序集或操作,这非常好:

这取决于编译器及其执行的优化。如果它执行死存储消除,那么它很可能会忽略向变量发送汇编代码。考虑

for(.....) i+= n;
i = 1;
return i;
可以很容易地优化到这一个,因为写入
i
的内容无论如何都会被后面的作业覆盖

i = 1;
return 1;
如果没有将1赋值给i,循环将运行
m次
,编译器可以将其优化为

i += n * m;
return i;

如果
i
是局部的且不会改变任何全局状态,则包括对
i
的增量进行整体优化(在前面的示例中也是如此)。如果
i
具有volatile限定类型,则编译器需要省略这些优化。它必须按照语言规范所描述的每一步去做。但是即使是这样,不同的编译器也会根据处理器的能力生成不同的汇编程序/指令。一般来说,你不知道编译器是如何将C++指令翻译成汇编指令的。从C++的角度,声明包含赋值的变量(例如“int x=5;”)是一个指令。如果在调试器中单步执行程序,它将在该行停止。但是谁知道编译器会用它做什么呢。(可能会对整个变量进行优化。)

编译时、链接时、加载时和执行时的具体工作量取决于各种情况。一个实现甚至不能保证在内存中有任何可以识别为x的东西。C++标准描述了一些内存布局和运行时约束,但它仅针对特定性:它也定义了可观察行为,并且明确地表示如果所有可观察行为匹配(“仿佛”规则),则实现可能会随心所欲。 这意味着唯一合理的答案将基于实现的实际功能,答案是这取决于


为什么您想知道某个特定的代码行是否转换为某个特定的机器代码?如果你说清楚了,也许我们可以回答一个对你有用的问题。

你没有提到x是哪种类型。如果x不是pod类型,并且它有一个接受int的构造函数,那么

x = 5
可能有其他影响,而不是像语法所暗示的那样“将5存储在某处”

#include <iostream>

int i;

class X {
  int _y;
public:
  X(int y) : _y(y) {
    i ++;   // changes a global variable
    std::cout << "got " << y << std::endl;  // does IO
  };
};

有完全不同的含义。所以,一般来说,在C++中,x=5是语句,因为它可能有任何副作用(例如在我的例子中:改变全局状态或做IO)。< /P> < P>如果变量是一个基元类型(int,char等):

X x = 5;