如何增加LARGE_INTEGER
我想在C++中增加LARGE_INTEGER
但我得到以下错误。如何增加LARGE_INTEGER
错误C2397:从“LONGLONG”到“DWORD”转换需要一个收缩转换
我不知道我做错了。其非常简单的问题,我试图重建项目,但错误不会消失。
std::atomic<LARGE_INTEGER> value; // this field is defined in header
这些行都是我试过的,都给出了同样的错误。
// inside a method in cpp
value = {get_some_large_integer().QuadPart + 1};
value = LARGE_INTEGER{get_some_large_integer().QuadPart + 1};
value = static_cast<LARGE_INTEGER>(LARGE_INTEGER{get_some_large_integer().QuadPart + 1});
您可以直接使用Quadpart。请注意,它是一个64位长整数。也称为long long和__int64,由MS编译器和gcc编译。由于它是一种普通的旧数据类型,编译器支持所有的算术运算和按位操作。
LARGE INTEGER
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart; // <-- this is a 64 bit integer.
} LARGE_INTEGER, *PLARGE_INTEGER;
LARGE_INTEGER的定义是一个普通的C结合,并因此不提供任何构造。但是,您可以使用C聚合初始化程序将其初始化为零。
LARGE_INTEGER li = {}; // initialize to zero.
使用QuadPart,你可以操纵LARGE_INTEGER,你会任何长长整型...
递增:
li.QuadPart++;
补充说:
__int128 i = 123456LL;
li.QuadPart += i;
等。 。
li.QuadPart = 123456LL * 5;
重要提示:MS使用LARGE_INTEGER联合来传递如此长的值,既出于历史原因,也用于强制long long的对齐。如果Quadpart未正确对齐,某些Windows API将崩溃。所以在调用Windows API时简单地将__int64 *强制转换为LARGE_INTEGER *并不是一个好习惯。
在64位窗口中,64位增量,即li.Quadpart ++是一个原子操作。
当然,你可以这样做,但是你抛弃了问题的'std :: atomic'部分。 –
由于@CodyGray在评论中提到的问题,我想出了这个解决方案。该操作仍然是原子的,因为atomic_store
只关心,变量x
和y
是线程和方法的局部变量。
LARGE_INTEGER x = get_some_large_integer();
LONGLONG y = x.QuadPart + 1; // increment
x.LowPart = (LONG)y;
x.HighPart = (LONG)(y >> 32);
value = x; // atomic operation.
是的,我必须使用'LARGE_INTEGER',因为我仅限于使用此数据类型的库窗口函数。是的,'value = {get_some_large_integer()};'也适用于我,但是'value = {get_some_large_integer()。QuadPart};'给出错误。看起来增量不是问题,但访问QuadPart是一个如何的问题。 @CodyGray –
@CodyGray我看到了,但它的怪异ctor不接受64位值。它的奇怪,如果它的64位值应该有! –
它正在从'li.QuadPart'中初始化'LARGE_INTEGER',这是问题所在。尝试不用'std :: atomic'。你会遇到同样的问题。没有办法直接从64位值构造'LARGE_INTEGER'(因为不幸的是,C++没有[指定初始化函数](https://stackoverflow.com/questions/31638182/initialize-union-using-largest -member-下MSVC编译器))。您需要使用两个32位的一半来构建它。我不知道这里有一个好的解决方案。也许别人会。 –