【问题标题】:How does size_t and the __w64, time_t and __int64 work?size_t 和 __w64、time_t 和 __int64 是如何工作的?
【发布时间】:2013-06-22 08:04:39
【问题描述】:

我不是 C 或 C++ 方面的老手。我不知道time_t 是如何定义和设计的。 几个帖子,如:

但这些帖子仅说明 time_tsize_t 是什么。它没有明确说明 time_t 或 size_t 是如何以及在何处定义和声明的。

我正在使用 WIN8 VS2012 Express C++。我搜索了库,发现size_t是在crtdefs.h中定义的,而不是cstddef

  • 为什么需要size_ttime_t 这样的类型?我们可以让sizeof 直接返回unsigned int
  • 为什么 C++ 库没有定义 size_t
  • 我可以说 size_t 不是 C/C++ 内置类型吗?
  • 我永远不需要在我的程序中包含相应的头文件来使用size_ttime_t(可能它们是在std 命名空间中定义的)。

我在库中再次搜索,发现size_t定义为typedef _W64 unsigned int size_t_W64定义为__w64。在这里,我无法搜索更多关于 __w64 是在哪里定义或声明的。

  • 什么是__w64 类型? C++11/C99 标准中没有说明。

同样,当我搜索time_t 时,我找到了__int6。但是不知道__int64从哪里来。

【问题讨论】:

标签: c++ size-t int64


【解决方案1】:

__w64 是 Microsoft 特定的扩展,它“在使用 /Wp64 编译时启用警告” - 如果您尝试将其编译为 64 位,它用于识别“危险”的代码 - 例如分配一个64 位值转换为 32 位值。例如:

size_t s;
...
unsigned int i;

...
i = s;    // 32 bit can't take all 64 bit values - possible problem. 

size_ttime_t 的定义是 typedef ... size_t;typedef ... time_t; - 它们在编译器中不是“固定的”。该标准只是说它们必须在那里(并且适合编译器目标的系统)。我想你会发现cstddef 在某些地方包含crtdefs.h

__int64 是 Microsoft 编译器类型。这是由编译器自己定义的。然后可以使用它来定义其他“大小类型”,例如time_tsize_t(根据需要使用合适的unsigned)。其他编译器可能没有这种类型,但会有一些方法来定义 8、16、32 和 64 位整数。 __int64 的实际起源可能在long long 的起源之前,很长一段时间(双关语)微软不支持它。我相信是现在。

【讨论】:

  • 我认为是。 long long从 C++11 开始的。
【解决方案2】:

C/C++ 已有 20 多年的历史,现在可能在 100 多种不同的架构上实现。

事实上,其中一些确实与 x86 不同。其中一些整数寄存器是 16 位的,而地址空间和地址寄存器是 32 位的。我有在这些环境中写作的经验。

是的,在这种情况下,int/unsigned int 是 16 位,这是有道理的,而指针和 size_t 是 32 位。在 x86 上不是这样,但好吧......

这就是答案。

size_t 不是 C/C++ 内置类型?

真正的答案是肯定和否定。理论上,你可以编写自己的头文件,比如crtdefs.h。并在那里写任何你想要的。编译器很可能会工作。但这是很多工作。没有人这样做。一旦系统头文件成为编译器的一部分,那么,size_t 是内置的......

【讨论】:

  • Int 不是 16 位长,它至少 16 位长。它不依赖于寄存器大小或任何东西,它只依赖于 ABI。
  • 您的陈述主要是错误的。 int 的大小取决于编译器制造商的决定。他们的决定取决于架构方面的原因。寄存器的大小是主要方面之一。 ABI 并非凭空出现。
  • 不,您的 陈述主要是错误的。 int 的大小取决于ABI 设计者 所做的决定。他们做出决定的依据并不重要。如果编译器遵循 ABI(并且大多数都是......),那么 ABI 会定义整数类型 EOT 的确切大小。
猜你喜欢
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2020-05-06
  • 2018-12-18
  • 1970-01-01
  • 2018-11-10
相关资源
最近更新 更多