【发布时间】:2018-08-26 16:35:20
【问题描述】:
#include<iostream>
#include<chrono>
using namespace std;
using namespace std::chrono;
class rmq
{
public:
rmq() = default;
rmq(size_t size) :m_pData(new unsigned int[size]), m_size(size) {}
~rmq(){ if (m_pData)delete[]m_pData;}
void populateValue() {
if (m_pData) {
for (size_t i = 0; i < m_size; i++) m_pData[i] = i;
}
else {
std::cout << "NUll reference" << std::endl;
}
}
unsigned int minQuery(size_t firstIdx, size_t lastIdx) {
unsigned int minValue = 0;
if (firstIdx < lastIdx && lastIdx <= m_size) {
minValue = m_pData[firstIdx];
while (++firstIdx < lastIdx) {
if (minValue > m_pData[firstIdx]) minValue = m_pData[firstIdx];
}
}
return minValue;
}
private:
unsigned int *m_pData;
size_t m_size;
};
int main()
{
rmq r(UINT32_MAX);
r.populateValue();
high_resolution_clock::time_point t1 = high_resolution_clock::now();
int minvalue = r.minQuery(0, UINT32_MAX);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
auto duration = duration_cast<nanoseconds>(t2 - t1).count();
std::cout << "RMQ:" << minvalue <<" "<<"Duration_i`enter code here`n_ns:"<<duration<<std::endl;
return 0;
}
当大小指定为 UINT32_MAX 时,我得到以下异常
RMQ.exe 中 0x763BC54F 处未处理的异常:Microsoft C++ 异常:内存位置 0x004CFAC0 处的 std::bad_array_new_length。
但同样的事情也适用于 UINT16_MAX。无法理解其背后的逻辑。
编译器版本为 Visual C++ 2015(也称为 Visual C++ 14.0)。
目标架构:x86
【问题讨论】:
-
可用内存的最大大小取决于:您是否编译为 x64,以及您机器上的可用 RAM。
-
请给我们一个minimal reproducible example 吗?我们无需查看您的
rmq课程即可重现该问题。 -
你知道
UINT16_MAX是65535,而UINT32_MAX是四十亿多一点?它们之间有很大的不同。 -
@AlgirdasPreidžius:可用地址空间几乎不取决于 RAM 的数量。您应该将 RAM 视为一种性能优化。
-
@IInspectable 是的,我忘记了虚拟内存(又名交换)是一个东西。但是,在最常见的用例中:内存量 = 软件可用的工作内存量。
标签: c++ windows pointers memory