环境:Microsoft Visual Studio 2010 SP1 SP1 Preminum(10.0.40219.1 SP1Rel),Windows XP SP3
VC10编译器支持auto关键字,但推导出的类型相关信息似乎并不总是正确的枚举.
例:
#include <type_traits>
enum fruit_t
{
apple = 100,
banana = 200,
};
int main()
{
const auto pa = new auto(banana);
const auto pb = new fruit_t(banana);
static_assert(std::is_same<decltype(pa), decltype(pb)>::value, "not same!");
delete pb;
delete pa;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码应该没有编译时错误或运行时错误.但让我感到惊讶的是,它编译好没有任何错误或警告,但是没有正确运行.调试器在退出main函数后告诉:
HEAP CORRUPTION DETECTED:%hs阻止(#55)在0x00034878.CRT检测到应用程序在堆缓冲区结束后写入内存.
所以我猜编译器可能在"自动"类型扣除中有错误.下面的汇编程序窗口显示,第一个"operator new"调用中请求的内存大小为1个字节,而第二个"operator new"为4个字节.它表明编译器在推断类型的大小上犯了很大的错误.
您认为这是编译器错误吗?微软是否有任何错误修复?
int main()
{
004113C0 push ebp
004113C1 mov ebp,esp
004113C3 sub esp,10Ch
004113C9 push ebx
004113CA push esi
004113CB push edi
004113CC lea edi,[ebp-10Ch] …Run Code Online (Sandbox Code Playgroud) 当我想编写像此平台上不存在的GetTicketCount64这样的函数时,Windows XP下会出现问题.这是我的测试代码:
uint64_t GetTickCountEx()
{
#if _WIN32_WINNT > _WIN32_WINNT_WINXP
return GetTickCount64();
#else
// http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408.aspx
LARGE_INTEGER Frequency = {};
LARGE_INTEGER Counter = {};
BOOST_VERIFY(QueryPerformanceFrequency(&Frequency));
BOOST_VERIFY(QueryPerformanceCounter(&Counter));
return 1000 * Counter.QuadPart / Frequency.QuadPart;
#endif
}
for (int i = 0; ++i < 1000; Sleep(30000))
{
const auto utc = time(nullptr); // System time
const auto xp = GetTickCount(); // API of Windows XP SP3
const auto ex = GetTickCountEx(); // Performance counter
const auto diff = ex - xp;
printf("%lld %I32u %I64u %I64u …Run Code Online (Sandbox Code Playgroud)