我们可以将“Eigen::Vector<T, D + 1>& x”重新解释转换为“Eigen::Vector<T, D>&”,以从“x”中提取第一个“D”分量吗?

0xb*_*00d 0 c++ reinterpret-cast eigen c++20

我需要计算D维函数的函数值和梯度并将这些值加在一起。D我认为简单地将梯度部分存储在第一个分量中并将函数值存储在D+1维向量的最后一个分量中将是有益于计算的。

但是,如何从该维向量中提取第一个D分量(即梯度部分) ?D+1我知道可以选择切片,但我不想在这里添加任何无意义的开销。所以,我尝试简单地reinterpret_cast<Eigen::Vector<T, D>&>在我的上做一个Eigen::Vector<T, D + 1>并且它起作用了;但这真的能保证有效(并且安全)吗?

use*_*522 5

它会导致未定义的行为。

仅当泛左值的类型与对象的类型相似时,才可以通过泛左值使用类的成员。相似意味着类型在const资格方面是相同的。

reinterpret_cast当你这样使用时,你改变了左值的类型,但你仍然让它引用与原始类型相同的对象。(如果同一地址处有一个目标类型的对象,并且该对象与原始对象可以进行指针互换,则存在某些例外情况,但我怀疑是否可以保证以包含标准布局的Eigen::Vector方式实现其开头的子Eigen::Vector<T, D+1>对象Eigen::Vector<T, D>,这是应用例外的先决条件。)


即使您不关心 UB 这样的问题,至少您还是对这两个类的内存布局做出了假设。但没有人能保证你的布局。(尽管如此,即使有保证,仍然会有UB。)

  • @0xbadf00d 根据标准它仍然会有未定义的行为。如果您相信您的编译器不会对其执行任何意外操作,那么可能没问题,但我不会像您在问题中所问的那样称之为“_真正保证工作(并且安全)_”。 (2认同)