注册 登录
编程论坛 C++教室

使用new创建动态数组的问题

hffjhhh 发布于 2020-08-03 23:55, 1476 次点击
C++用new运算符创建动态数组有个特性,当在程序运行时需要数组的时候则创建它,如果不需要,则不创建。
那么怎么判断程序在运行时到底有没有创建数组呢?
比如以下这段程序,这段程序在运行的时候到底需不需要创建数组?到底有没有创建数组呢?代码如下:
程序代码:
#include<iostream>
using namespace std;
int main(void){
    double *a=new double [3];
    a[0]=2.3;
    a[1]=3.3;
    a[2]=4.3;
    cout<<"a[1]="<<a[1];
    return 0;
}
7 回复
#2
rjsp2020-08-04 08:29
你从哪儿听来的?

当在程序运行时需要数组的时候则创建它,如果不需要,则不创建。
这个“需要/不需要”取决于你自己,你认为需要那你就写new,你认为不需要那你就不new。与C++、与编译器无关。

到底有没有创建数组呢?
这取决于编译器的优化,但与你无关,因为无论编译器怎么优化,其外在表现都应该跟你的代码一致。
举个例子,即使编译器将你的代码优化成 int main(void) { cout << "a[1]=" << 3.3; return 0; },但你需要关心吗?不需要呀!因为优化后的代码外在行为与你原代码的外在行为一致。就像你叫外卖,别人将外卖送给你就行了,你管别人是用脚走过来的,还是开劳斯莱斯过来的。
#3
lin51616782020-08-04 10:58
你想说的大概是 写时拷贝
这种层面的技术对你的代码来说的透明的
你不用分析这个技术
#4
lin51616782020-08-04 10:59
不管是分析代码运行还是调试代码
这个技术都不会影响结果

#5
hffjhhh2020-08-04 14:08
回复 2楼 rjsp
书上有一段这样的描述:
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
#6
apull2020-08-04 15:10
程序代码:

    int b[5];    //编译时分配内存
    int *c = new int[5];    //编译时分配内存

    int *a, n;
    scanf("%d", &n);
    a = new int[n];    //根据输入的n,创建n个元素的数组,n也可以是其他方式计算出来的。
#7
Jonny02012020-08-05 00:47
如 @rjsp 所说, 不论编译器的行为是什么, 都和你没有关系
在 Clang 10.0.0 下, 不开优化 (-O0), 会明确调用 operator new, 也就是说发生了内存申请
但是在优化等级开到第一级 (-O1) 的情况下, 就会直接输出 0, 不会产生内存分配
GCC 的行为也是类似的
#8
lin51616782020-08-05 10:34
回复 5楼 hffjhhh
这段话的意思是
需要分配内存 就写new
不需要分配内存 就不写new
1