【发布时间】:2021-01-12 23:01:30
【问题描述】:
c++ 宏 offsetof 只是在标准布局类型上使用时定义的行为。据我了解,这是因为编译器可以根据其运行的代码的上下文更改数据的内存布局。 (例如从不使用变量时)
但是,我想知道存储在一个范围中的所有元素是否共享相同的布局。或者,换句话说,如果以下代码定义明确:
template<typename T>
concept has_member_int = requires(const T& x)
{
{ x.member } -> std::same_as<int>;
};
template <std::ranges::Range Range_t, has_member_int T>
void setEveryMemberTo20(Range_t<T> range)
{
if (range.size() > 0)
{
auto& firstElement = *(range.begin());
auto ptrdiffToMember = &(firstElement.member) - &firstElement;
for (auto& element : range)
{
*(reinterpret_cast<int*>(&element + ptrdiffToMember)) = 20;
}
}
}
【问题讨论】:
-
element.member = 20;有什么问题?您是否对类型可能被擦除或成员变量的名称未知,并且由于某种原因指向成员的指针不可行的情况感兴趣? -
@RemyLebeau 是的,但数组是一种特殊的容器,将所有数据连续存储在内存中。
-
@alterigel 显然我发布的代码是一个最小的可重现示例,说明了我的问题
-
@user3520616 是否在一个连续的数组中,这不会改变我所说的。
-
编译器不会删除未使用的结构成员。在很多实际情况下,这样的事情往往会中断——例如,如果链接了一个新的对象文件,而该文件现在使用了数据结构中以前未使用的成员。消除未使用的变量往往会发生,因为有关变量使用的所有信息都在(例如)单个函数中可见。对于跨多个编译单元使用的数据结构,情况并非如此。