【问题标题】:size_t is pointer size in practicesize_t 实际上是指针大小
【发布时间】:2010-12-07 00:35:13
【问题描述】:

首先让我澄清一下,我现在非常熟悉 size_tintptr_t 的定义,我不希望重复它们所完成的工作。

相反,我想知道以下内容。您是否知道任何平台,除了 x86/DOS(及其难以忍受的内存模型)在哪里进行转换

void* a = ...;
size_t b = (size_t)a;

实际上丢失了位或字节?

谢谢!

【问题讨论】:

  • 你为什么要投一个指向 size_t 的指针???
  • 附带说明,我什至无法想象这样的问题可能来自哪里。为什么你会想做这样的演员? 'size_t' 的大小和指针的大小是完全不相关的,所以很自然地假设这样的平台在一般情况下存在,而不管它们在现实中是否存在。
  • 假设size_t 的大小和指针的大小相同可能不是一个好习惯,并且不应该用这个假设编写新代码,我可以看到这样的问题在哪里可能来自:遗留代码。我想那里有 很多 代码可以做出这种假设。就像有很多代码假定 int 或 long 是 32 位一样(不多也不少 - 这就是 MS 为 Win64 选择 LLP64 模型的原因)。有人(甚至可能是 Jonas)可能想确定是否值得花费时间和精力来主动更改遗留代码。
  • @MitchWheat 我也问过同样的问题:programmers.stackexchange.com/questions/294761/…

标签: c


【解决方案1】:

AFAIK,AS/400 上的指针是 128 位的,但 size_t is defined to be 32-bit

【讨论】:

  • 有趣! sizeof(long) 的产量是多少?
  • 64-bit 似乎很长,但不能确定。
  • 一个更重要的问题是:您能否提供一个示例,说明将指针转换为 size_t 是有效代码的地方?
  • 将指针转换为size_t 总是有效的。您可以对结果有效做什么是另一个问题。
  • 这不是编译器的缺陷,是硬件/操作系统编译器的特性必须匹配。标准没有规定 intptr_t 类型的存在理由是指针大小可能与任何其他类型无关,因此不可能将其存储在“正常”整数变量中。参照。在 x86 实模式的(理论上)C99 编译器中,intptr_t 将是 32 位(用于存储 far ptr),但 size_t 将是 16 位,因为连续内存区域大小限制为一个段。
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多