Unsigned int在发布模式下的行为有所不同

时间:2013-02-13 14:11:56

标签: c++ visual-studio-2012 unsigned-integer cpuid

我有一个奇怪的问题,在调试模式下,这段代码工作正常:

char* PCInformation::GetCPUName()
{
    if (CPUName[0] == '\0')
    {
        _memset(CPUName, 0, 0x3F);
        // Get extended ids.
        int CPUInfo[4] = {-1};
        __cpuid(CPUInfo, 0x80000000);
        unsigned int nExIds = CPUInfo[0];

        printf(3, "%d\n%d\n", nExIds, 0x80000000);

        // Get the information associated with each extended ID.
        for(unsigned int i=0x80000000; i<=nExIds; ++i)
        {
            printf(3, "0x80000000 nExIds: %X, i: %X\n", nExIds, i);
            getchar();
            __cpuid(CPUInfo, i);

            // Interpret CPU brand string and cache information.
            if  (i == 0x80000002)
            {
                _memcpy( CPUName,
                CPUInfo,
                sizeof(CPUInfo));
            }
            else if( i == 0x80000003 )
            {
                _memcpy( CPUName + 16,
                CPUInfo,
                sizeof(CPUInfo));
            }
            else if( i == 0x80000004 )
            {
                _memcpy(CPUName + 32, CPUInfo, sizeof(CPUInfo));
            }
        }
    }

    return CPUName;
}

来源:http://weseetips.com/2009/06/21/how-to-get-the-cpu-name-string/

修改: (这就是_functions的样子)

BOOL CallDynamic(const char* szModule, const char* szFunction, DWORD* dwReturn, size_t argc, ... );
#define printf(argc, ... ) (CallDynamic(MSVCRT, "printf", NULL, argc, __VA_ARGS__ )) //number arguments, arguments

如果你想知道为什么STD-C函数有_,因为它们是动态调用的,但问题。 (因为相同的代码用于工作正常,但我把它放在一个类和bahm!)

无论如何,如果我选择Release(作为构建模式)(int)i 包含一些奇怪的值或其他东西。更多声明一些图片:

版本 Release Build

调试 Debug Build 在发布中,它最终会有无限的for循环。

修改:我刚刚将代码更改为:

char* PCInformation::GetCPUName()
{
    if (CPUName[0] == '\0')
    {
        _memset(CPUName, 0, 0x3F);

        int CPUInfo[4];
        _memset(CPUInfo, 0, 4);

        __cpuid(CPUInfo, 0x80000000);
        _memcpy(CPUName, CPUInfo, sizeof(CPUInfo));

        __cpuid(CPUInfo, 0x80000002);
        _memcpy(CPUName + 16, CPUInfo, sizeof(CPUInfo));

        __cpuid(CPUInfo, 0x80000003);
        _memcpy(CPUName + 32, CPUInfo, sizeof(CPUInfo));

        __cpuid(CPUInfo, 0x80000004);
        _memcpy(CPUName + 48, CPUInfo, sizeof(CPUInfo));
    }

    return CPUName;
}

我仍然想知道是什么导致它。

此致

0 个答案:

没有答案