C++ 局部变量的内存放置

C++ 局部变量的内存放置,c++,C++,假设我的范围内有两个变量 INTA,b 假设它们将一个接一个地存储在进程的内存中是否安全?如果该作用域是本地函数作用域,那么就不安全了。本标准对此不作任何保证。与结构相反如果该作用域是本地函数作用域,那么不,假设它是不安全的。本标准对此不作任何保证。与结构相反否,假设它是不安全的。 但大多数时候,它们会一个接一个地存储在进程的内存中 像这样: #include<iostream> using namespace std; int main() { int a,b; c

假设我的范围内有两个变量

INTA,b


假设它们将一个接一个地存储在进程的内存中是否安全?如果该作用域是本地函数作用域,那么就不安全了。本标准对此不作任何保证。与结构相反

如果该作用域是本地函数作用域,那么不,假设它是不安全的。本标准对此不作任何保证。与结构相反

否,假设它是不安全的。 但大多数时候,它们会一个接一个地存储在进程的内存中

像这样:

#include<iostream>
using namespace std;
int main()
{
    int a,b;
    cout<<&a<<endl;
    cout<<&b<<endl;

    int c;
    int d;
    cout<<&c<<endl;
    cout<<&d;

}
以下程序的输出为:


在这里,我们可以很容易地注意到,这四个地址只是四个大小不同的连续内存块。

不,这是不安全的。 但大多数时候,它们会一个接一个地存储在进程的内存中

像这样:

#include<iostream>
using namespace std;
int main()
{
    int a,b;
    cout<<&a<<endl;
    cout<<&b<<endl;

    int c;
    int d;
    cout<<&c<<endl;
    cout<<&d;

}
以下程序的输出为:


在这里,我们可以很容易地注意到,这四个地址只是四个大小不同的连续内存块。

快速回答,否。它们将一个接一个地存储-未定义的是哪个存储在较低的地址中,如果它们之间有填充的话会怎样呢?你只能在参数上使用这种技术,因为这些参数具有定义的函数顺序和特定的调用约定。这就是varargs是如何确定的。@engf-010-不是真的,参数甚至可能不在内存中,它们可能在寄存器中。varargs的工作方式是编译器/c运行时编写者决定它将适用于给定的工具链/标志组合。变量可能存储在处理器寄存器中,因此没有可访问的内存位置。快速回答,否。它们将一个接一个地存储-未定义的是哪个存储在较低的地址中,如果它们之间有填充的话会怎样呢?你只能在参数上使用这种技术,因为这些参数具有定义的函数顺序和特定的调用约定。这就是varargs是如何确定的。@engf-010-不是真的,参数甚至可能不在内存中,它们可能在寄存器中。varargs的工作方式是编译器/c运行时编写者决定它在给定的工具链/标志组合中工作的方式。变量可能存储在处理器寄存器中,因此没有可访问的内存位置。大多数情况下,取决于Most和时间的定义,当然,变量将在寄存器中,除非您显式地获取地址,迫使它们被放在内存中的某个地方,可能是堆栈。即使变量在内存中,如果值恰好暂时在寄存器中,严格的别名允许编译器只使用寄存器中的值,而不检查内存。你应该把这个答案定性为假设没有优化,假设变量的地址在某个时候被取。你需要考虑寄存器。编译器可以使用寄存器来表示变量。在汇编语言列表中可以看到这一点。大多数情况下,取决于Most的定义和时间,当然变量将在寄存器中,除非您显式地获取地址,强制将它们放入内存中的某个位置,可能是堆栈。即使变量在内存中,如果值恰好暂时在寄存器中,严格的别名允许编译器只使用寄存器中的值,而不检查内存。你应该把这个答案定性为假设没有优化,假设变量的地址在某个时候被取。你需要考虑寄存器。编译器可以使用寄存器来表示变量。您将在汇编语言列表中看到这一点。