【发布时间】:2018-02-14 04:14:20
【问题描述】:
我有一个简单的例子,对数组求和:
static uint64_t ySumSimple(uint32_t* arr, uint32_t* to) {
uint64_t sum = 0;
while (arr < to) {
sum = sum + *arr;
++arr;
}
return sum;
}
并在 main 方法中使用它,例如:
using namespace std;
int main(){
size_t size = 1000*1000;// len*loops;
uint32_t * arr= (uint32_t *) malloc(size * sizeof(uint32_t));// random values here
auto sum = ySumSimple(arr,arr+size);
cout <<" sum " << sum << endl;
}
如果 size = 1000*100,这将返回实际总和(某个大数字),但对于一百万个 uint,它返回 0。如果超过一百万个 uint 的总和不能溢出 ulong,那怎么会呢?
【问题讨论】:
-
没有“C/C++”之类的东西。
-
对未定义的行为一无所知,实际的解释可能与如何分配各种大小的内存块有关。许多 C++ 运行时实现在进程内保留一个较小的内存块池,以便有效地重用,但是当您 malloc() 真正大量的内存时,它们会退回到直接从操作系统的空闲存储中分配内存。为了避免安全问题(例如,非特权应用程序 A 读取特权应用程序 B 的秘密但免费()数据),操作系统免费存储的内存通常在分配给应用程序之前清零。
标签: c++