【问题标题】:Getting a Pointer to the First Element of a Struct获取指向结构的第一个元素的指针
【发布时间】:2018-12-18 16:02:17
【问题描述】:

我认为标准为我提供了一个函数来查找结构的 1st 元素。不过我好像找不到。

我害怕对齐:我认为 reinterpret_cast 进入结构的 1st 元素是不合法的,是吗?

例如给定struct { int first, int second } foo;如果我不知道 first 被布置为 1st 元素,我将如何获取 foo 中的 1st 元素的地址? (意味着&foo.first 不是一个有效的解决方案。)

【问题讨论】:

  • 看起来您可能正在寻找std::offsetof。如果是这样的话,我会试着找到一个骗子
  • 否则如果是标准布局类,则struct的地址和第一个成员的地址是一样的。也有一个骗局。
  • 我很好奇——什么时候知道“第一个元素的地址,不管那个元素是什么”,有别于“结构的地址”?
  • 为什么需要这个?也许这是一个 X-Y 问题,或者有人在您描述了用例后得到了一个想法

标签: c++ pointers struct alignment member


【解决方案1】:

我认为将 reinterpret_cast 转换为结构的第一个元素是不合法的吗?

合法的,但前提是类是标准布局。标准草案:

[basic.compound]

如果满足以下条件,两个对象 a 和 b 是指针可互转换的:

...

  • 一个是标准布局类对象,另一个是该对象的第一个非静态数据成员, 或者,如果对象没有非静态数据成员,则该对象的任何基类子对象 (10.3),或

...

如果两个对象是指针可互转换的,那么它们具有相同的地址,并且有可能获得一个 通过 reinterpret_cast 从一个指向另一个的指针指向另一个的指针 ...

【讨论】:

  • 所以这就是我所需要的,但遗憾的是我也确实需要能够获得类型:(这超出了这个问题的范围。我会在某个时候写另一个问题。跨度>
  • @JonathanMee 要获得一般第一个成员的类型,您需要(静态)反射,这在 C++ 中确实没有。如果您可以限制类型,那么您可以使用带有别名的特征模板作为第一个成员的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多