内存分配- Java vs c++
memory allocation - Java vs C++
给定java和c++中的类Line,以及java和c++中的以下声明-
Line[] p;
和
Line *p;
当运行以下代码时,两种语言在语义上有什么不同:
p = new Line[7];
特别是,这两种语言是否以相同的方式为数组分配堆内存?对不起,我对这件事做了研究,但我仍然觉得我没有完全了解。
谢谢!
你在比较不相等的Java和c++代码。下面的c++代码相当于Java代码(引用数组):
Line **p;
p = new Line*[7];
你发布的c++版本:
Line *p;
p = new Line[7];
是一个对象数组,并使用'Line'的默认构造函数初始化数组的每个元素(尝试使用一个显式的1参数构造函数,您将看到c++告诉您需要默认构造函数)。Java没有类似的方法来创建非基本类型数组,让每个元素都默认构造(在Java中,非基本类型数组的所有元素都是'null',除非你显式地为它们赋值)。
在Java中声明数组时,它们被存储为引用数组。在c++中初始化Line
类的数组时,您不会遇到这种开销开销,因为您的数组将保存对象,而不仅仅是它们的引用。
如上所述,等效的c++代码实际上是
Line **p;
p = new Line*[7];
因为Java分配的是引用数组,而不是临时对象数组。
在c++中,new
操作符保证从堆中分配内存。在Java中——这要看情况。通常new
关键字从堆中分配内存,但一些编译器,如HotSpot执行所谓的"转义分析":如果编译器检测到指针没有从函数返回,也没有去到不同的线程-它可能在堆栈中声明对象(相当于Line p[7]
c++)
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- VS 2017 使用交叉编译器构建 x64 项目