字符串和 int 对象或左值/右值的内存位置
Memory location of string and int objects or lvalues/rvalues
我正在使用GCC在Mac OS X上编译以下代码:
using namespace std;
int x;
int& getRef () {
return x;
}
string getName () {
return "Alex";
}
int main() {
int a;
a = 7;
getRef() = 4;
cout << x << ", address: " << &getRef() << endl;
string name = getName();
cout << getName() << ", address: " << &name << endl;
}
该程序的输出是:
4, address: 0x10617c0d8
Alex, address: 0x7fff59a851b0
我想了解两件事:
- 为什么每次运行此程序时,这两个变量的值总是存储在相同的地址下?
- 为什么
string
的地址比int
长,这与getName()
是右值有关吗?
这两个变量的地址之间看似很大的差距的原因是它们被分配在可执行映像的不同内存部分中:
-
全局变量
x
在数据部分中分配。因此,它的地址在整个程序执行过程中都是恒定的。
-
局部变量
函数name
在堆栈中分配。中局部变量的地址取决于调用函数时堆栈的状态(SP 寄存器的值)。
在您的示例中,每次调用函数 main
时,堆栈的状态都完全相同。
但假设此变量是在不同的函数中声明的:
void func1()
{
string name = getName();
cout << getName() << ", address: " << &name << endl;
}
现在,尝试从不同的堆栈深度中调用此函数,您将获得不同的地址:
void func2()
{
func1();
}
int main()
{
func1();
func2();
return 0;
}
您获得的地址相同,因为您在虚拟内存中运行相同的程序。这意味着您始终拥有自己的地址空间,并且没有理由在确定性运行中具有不同的行为。
地址始终具有相同的体系结构特定长度。指针的长度并不能说明存储在那里的内存。 (否则指针转换会很困难)
此外,0x0001将被截断为0x1
相关文章:
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 向量的内存位置不连续
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 常量引用的内存位置
- C++强制变量到一个固定的内存位置
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 为什么存储在内存位置的值会发生变化?
- 在特定内存位置构造 c++ 对象
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 内存位置出现Microsoft C++异常:std::out_of_range
- 函数,返回变量c++占用的内存位置的大小
- 无法在 Opencv 中显示图像导致内存位置
- 从十六进制到双的转换始终导致内存位置的 std::out_of_range
- 错误 在测试.exe 0x76C9FD62时出现未经处理的异常:Microsoft C++异常:内存位置0x006FF8
- 错误:内存位置的 std::length_error
- C++不同内存位置中的默认数组值
- 为什么动态分配的两个变量的内存位置不是连续的?
- Boost.进程间内存位置
- 查找编译时构造类的内存位置