c++ - ULARGE_INTEGER union 的意义何在?

标签 c++ c windows winapi

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383742%28v=vs.85%29.aspx

它们应该是这样使用的,在 LowPart 和 HighPart 上设置两个 32 位的值,然后在 QuadPart 上进行运算。

int a,b,c;
ULARGE_INTEGER u;
...
u.LowPart = a;
u.HighPart = b;
u.QuadPart += c;

因此,如果您要在 QuadPart(64 位)上执行算术运算,无论如何您都需要 64 位处理器,对吗?那么重点是什么?为什么不直接将值分配给 QuadPart?

最佳答案

您不需要 64 位处理器来对 64 位数据类型执行算术运算。我所知道的所有 32 位编译器都支持 64 位整数的算术运算。如果硬件不允许 native 算术,则编译器必须生成代码来执行算术。通常,这将利用编译器 RTL 中的支持函数。

该结构旨在供不为 64 位数据类型提供 native 支持的编译器使用。非常documentation您链接到的内容清楚地表明了这一点:

Note Your C compiler may support 64-bit integers natively. For example, Microsoft Visual C++ supports the __int64 sized integer type. For more information, see the documentation included with your C compiler.

不支持 native 64 位整数的编译器将无法将 QUADPART union 成员视为整数。

typedef union _ULARGE_INTEGER {
  struct {
    DWORD LowPart;
    DWORD HighPart;
  };
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } u;
  ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;

以及ULONGLONG的定义:

#if !defined(_M_IX86)
 typedef unsigned __int64 ULONGLONG;
#else
 typedef double ULONGLONG;
#endif

当然,过去 10 年(或更长时间)内编写的所有编译器都将原生支持 64 位整数。但是这个 union 最初是在很久以前引入的,那时的编译器环境会有所不同。查看 Windows 头文件时,请始终牢记历史和遗产。

关于c++ - ULARGE_INTEGER union 的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14915752/

相关文章:

c 库 x86/x64 汇编程序

c - 错误 : 'Mystruct' undeclared (first use in this function)

java - 从Windows命令行程序生成多线程Java程序,spawner在spawnee结束之前不会结束。如何防止挂起?

c++ - 在没有可再发行运行时的情况下运行 C++ 二进制文件(Server 2k3、XP SP3)

windows - Windows 批处理文件的文件大小和行长度限制

c++ - 通过指针与数组引用进行数组索引序列扩展

c++ - WINAPI 枚举WindowsProc : Non-Standard Syntax; use & to create a point to a member

c++ - ofstream- 将元素写入文件 - C++

c++ - 获取被调用函数的行号

c++ - 绑定(bind)通用成员函数