堆栈分配的类类型.为什么两个 ID 实例的地址相同?
Class type for stack allocation. Why the address for both ID instances are the same?
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++ 文件.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 createID(const std::string& name)
{
ID id(name); // new stack allocation for id
std::cout << "ID addr: " << &id << "n";
return id;
}
对于呼叫:
ID my_id = createID("John"); // new stack allocation for my_id
编译器似乎正在执行 NRVO(名为返回值优化(。所以函数中没有实际的id
复制到变量my_id
,也没有单独的分配。
相反,此副本被省略,您会看到相同的地址。所以评论// new stack allocation for my_id
实际上是不正确的。
请注意,NRVO 不能保证发生,因此不应依赖此行为。编译器可以制作副本,从而产生不同的地址。实际上,这就是func
返回int
的示例中发生的情况。由于这是一种便宜的复制类型,编译器实际上会制作副本,并且您会看到不同的地址。
相关文章:
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 如何在给定设备实例ID的情况下可靠快速地获取网卡的MAC地址
- 再次接收实例 CTreeCtrl 的 ID
- 是否为每个模板实例化生成唯一的类型或id?(观察者模式示例)
- 为类的每个实例分配唯一 ID