差异: A* a=新 A();与 A b;A *c=&b;
Differences: A* a=new A(); vs. A b; A *c=&b;
本文关键字:差异 更新时间:2023-10-16
采访中问道。
-
A* a=new A();
-
A b; A *c=&b;
1和2的区别是什么?
我在第二条语句中说过,对象是在堆栈上创建的,在第一条语句中是在堆上创建的。我朋友说对象总是在堆上创建的
正确答案是什么?
你是对的-第二块代码- 假设它出现在函数中-将在堆栈上有b
和c
,尽管当然取决于A
的类型,它可能有指向堆分配内存的内部指针(std::string
, std::vector
等都是这样的例子,如果它们不是空的并且大于任何内部缓冲区)。
也就是说,a
本身也会在第一个块的堆栈上——它只是指向的对象——*a
,它必然在堆上。
换句话说,a
和c
实际上是等价的:基于堆栈的值,但是前者指向堆分配的A
,而后者指向另一个堆栈分配的A
....
"Stack"answers"heap"是实现术语。选择#1动态地分配A
,选择#2自动地做同样的事情。可能程序最终会使用堆*之类的东西来进行动态存储,使用堆栈来进行自动存储,但这并不能保证。
但是接受这个术语的松散用法,"对象总是在堆上创建"肯定是不正确的。也许你的朋友正在考虑Java?
*不是数据结构意义上的
相关文章:
- 将两个数组中的差异记录在第三个数组中
- 大小相等但成员数量不同的结构之间的性能差异
- C++constexpr实现差异
- 旧版c++中结构和类之间的差异
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- GCC 和 Clang 代码性能的巨大差异
- 类内部和外部静态 constexpr 元组之间的差异
- 平凡类型与非平凡类型的复制消除差异
- 了解算法的性能差异(如果以不同的编程语言实现)
- 以天C++为单位的两个时间戳之间的差异
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 方括号 [] 和括号 () 之间的犰狳库差异
- 不同语言中的模运算符差异
- std::filesystem 和 std::experimental::filesystem 之间的路径差异
- C++语法差异:二维和一维数组(指针算术)
- 获取 2 个数字之间的差异百分比
- AVX 指令中寄存器和指针之间的客观差异
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 字符和整数中 **(ptr+1) 的值差异