我有一个用GCC 11.2编译的程序,它首先在堆上分配一些内存(8 GB)(使用new),然后用从示波器实时读出的数据填充它.
uint32_t* buffer = new uint32_t[0x80000000];
for(uint64_t i = 0; i < 0x80000000; ++i) buffer[i] = GetValueFromOscilloscope();
我面临的问题是,优化器跳过第一行上的分配,并像我遍历循环一样动态地执行它.这会减慢循环的每次迭代所花费的时间.因为在循环期间尽可能高效是很重要的,所以我找到了一种在进入for循环之前强制编译器分配内存的方法,即将所有保留的值设置为零:
uint32_t* buffer = new uint32_t[0x80000000]();
我的问题是:有没有一种侵入性更小的方法来达到同样的效果,而不是从一开始就强制数据为零(除了关闭优化标志)?我只想强制编译器在声明时保留内存,但我不在乎保留的值是否为零.
提前谢谢!
EDIT1:我看到的知道优化器延迟分配的证据是,当我遍历循环时,‘gnome-system-monitor’显示RAM内存缓慢增长,并且只有在我完成循环后,它才达到8GiB.然而,如果我将所有值初始化为零,则GNOME-SYSTEM-MONITOR显示快速增长到8GiB,然后它开始循环.
EDIT2:我正在使用Ubuntu 22.04.1 LTS