【发布时间】:2020-09-24 21:10:33
【问题描述】:
class ID
{
public:
ID(const std::string& name) :
name_(name) {}
// explicit copy constructor as my first solution but gave me same address
ID(const ID& other)
{ name_ = other.getName(); }
std::string getName() const
{ return name_; }
private:
std::string name_;
};
ID createID(const std::string& name)
{
ID id(name); // new stack allocation for id
std::cout << "ID addr: " << &id << "\n";
return id;
}
int main()
{
ID my_id = createID("John"); // new stack allocation for my_id
std::cout << "my_id addr: " << &my_id << "\n";
std::cout << my_id.getName() << std::endl;
}
平台:Ubuntu 终端(Windows 的 Ubuntu 子系统)
编译:g++ file.cpp
输出:“ID 之间的地址相同”
不应该输出提供不同的堆栈地址吗?
我尝试用原始整数(而不是 ID 类类型)复制它,它为不同的实例输出不同的地址。
int func(int i)
{
int j = i;
std::cout << "i addr: " << &i << std::endl;
std::cout << "j addr: " << &j << std::endl;
return i;
}
int main()
{
int x = 10;
std::cout << "X addr: " << &x << std::endl;
int y = func(x);
std::cout << "Y addr: " << &y << std::endl;
}
【问题讨论】:
-
请显示您正在运行的完整示例。在您的代码中,我没有看到“ID 之间的地址相同”。
-
类从第一个变量的开头开始。如果它是继承类,则从父类的第一个变量开始。如果它有虚函数,那么它以虚表的地址开始。所以第一个变量地址和类的地址是一样的。如果类中有更多变量,则每个新变量都放在前一个变量之后。
-
这就是所谓的命名返回值优化或NRVO。看来我们只有解释 RVO 和复制 ellison 的副本 - What are copy elision and return value optimization?
标签: c++ memory-management stack-allocation