Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 联合对象的行为类似于结构 更新:_C++_Windows_Performance_Winapi_Performancecounter - Fatal编程技术网

C++ 联合对象的行为类似于结构 更新:

C++ 联合对象的行为类似于结构 更新:,c++,windows,performance,winapi,performancecounter,C++,Windows,Performance,Winapi,Performancecounter,如果你想看到这个问题的原始表现,请阅读“原始问题”部分 简而言之,我正在修改C++联盟对象的一个字段,但是这对字段的其余部分没有影响,它的行为非常类似于一个结构。解决方法:见我的答案 原始问题 tl;dr:queryPerformanceCounter不应该在所提供的LONG\u INTEGER的QuadPart字段中返回其值,而不是高部分/低部分?我在任何地方都找不到这是特定于系统的,但似乎是这样。 细节 我从Windows的queryPerformanceCounter中得到一种特殊的行为。

如果你想看到这个问题的原始表现,请阅读“原始问题”部分

简而言之,我正在修改C++联盟对象的一个字段,但是这对字段的其余部分没有影响,它的行为非常类似于一个结构。解决方法:见我的答案

原始问题 tl;dr:
queryPerformanceCounter
不应该在所提供的
LONG\u INTEGER
QuadPart
字段中返回其值,而不是
高部分
/
低部分
?我在任何地方都找不到这是特定于系统的,但似乎是这样。

细节 我从Windows的
queryPerformanceCounter
中得到一种特殊的行为。仔细考虑一下这个非常简单的用法:

这似乎很随机,但事实并非如此。添加转储功能:

ostream& operator << (ostream& os, const LARGE_INTEGER& li) {
return os << std::hex << std::setfill('0') << "["
    << "HP: 0x"   << std::setw( 8) << li.HighPart   << ", "
    << "LP: 0x"   << std::setw( 8) << li.LowPart    << ", "
    << "u.HP: 0x" << std::setw( 8) << li.u.HighPart << ", "
    << "u.LP: 0x" << std::setw( 8) << li.u.LowPart  << ", "
    << "QP: 0x"   << std::setw(16) << li.QuadPart   << "]"
    << std::dec << std::setfill(' ');
}
因此,隐值
-3689348814741910324
只是四部分的默认未初始化值:
0xcccc
。因此调用QueryPerformanceCounter(&start);没有更新
QuadPart
,而是更新
LowPart
HighPart
。由此可以明显看出,如何将QueryPerformanceCounter的实际返回值提取为LONGLONG:

// Extract the HighPart/LowPart pair from a LARGE_INTEGER as a LONGLONG.
LONGLONG odd_extract(LARGE_INTEGER li) {
    return (static_cast<LONGLONG>(li.HighPart) << 32) + li.LowPart;
}
最后,以秒为单位计算经过的时间将返回预期值:

LONGLONG elapsed = odd_extract(end) - odd_extract(start);
double seconds = static_cast<double>(elapsed) / odd_extract(freq);
cout << "elapsed: " << seconds << " s" << endl;
这是Windows不准确的
Sleep()
所期望的

现在我的问题是:
queryPerformanceCounter
不应该在所提供的
LONG\u整数的
QuadPart
字段中返回其值,而不是
HighPart
/
LowPart
?我在任何地方都找不到这是特定于系统的,但似乎是这样。

更新1 系统:
64位Windows 7 Enterprise

编译器/IDE:
MVS2010 v。10.0.40219.1 SP1Rel

C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\Include\WinNT.h
中定义大整数:

typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;
尽管如此,似乎尽管大整数是一个并集,但它的行为却不像一个

更新2 似乎我没有看到这种行为与一个新的解决方案/项目。也许在解决方案中还有另一个问题,我正试图衡量导致此问题的性能

在任何情况下,我仍然不知道为什么会发生这种情况,所以任何关于如何解决它的建议都是欢迎的,谢谢

#define union   struct
在我调试的项目的头文件中


我哭了。

大整数是一个联合体。QuadPart与HighPart/LowPart重叠,因此我无法解释您看到的内容。您是否使用了一些非标准结构打包(
#pragma pack
或类似的打包)?另外,您使用的是什么编译器,目标是什么平台?您检查过调试器中的变量了吗?它们是否与打印到标准输出的相同?@RogerLipscombe:我为我的系统添加了一个定义为大整数的更新。它确实看起来像是一个联盟,但行为却不像一个联盟@IInspectable:我不知道
#pragma pack
,所以我假设我没有使用它,哈哈(虽然这是可能的,因为我正在处理一个从别人那里继承来的更大的项目)。请参阅有关系统的更新。我首先在调试器中检查了变量,然后决定在我的SO问题中为了清楚起见将它们打印出来,但是是的-它们在调试器中是相同的。对于MS示例(在您的键入修复之后),我得到的
范围是31044870256到31047598565
,所以我无法复制你用它报告的问题。@KenWhite:请看第二次更新。嗯*空白凝视*如果你知道,为什么有人把这个放在头文件中,我很想听听。你可能也应该把这个消息传给这个人:在C++中重新编码< > >定义< /Cord>关键字是违法的吗?某种恶作剧?我希望编译器对未使用
尖叫\u丑陋\u大写字母
命名的宏给出一般错误。我对这个代码表示哀悼。
// Extract the HighPart/LowPart pair from a LARGE_INTEGER as a LONGLONG.
LONGLONG odd_extract(LARGE_INTEGER li) {
    return (static_cast<LONGLONG>(li.HighPart) << 32) + li.LowPart;
}
cout << "range: from " << odd_extract(start) << " to " << odd_extract(end) << endl;
range: from 47158533369 to 47161073403
LONGLONG elapsed = odd_extract(end) - odd_extract(start);
double seconds = static_cast<double>(elapsed) / odd_extract(freq);
cout << "elapsed: " << seconds << " s" << endl;
elapsed: 1.02861 s
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;
#define union   struct