- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在结构内对齐成员的最佳或常规方法是什么?添加虚拟数组是最佳解决方案吗?
我有一个 double
的结构和 double
的三倍是吗?
struct particle{
double mass;
std::tuple<double, double, double> position;
}
如果我有这些的数组,内存将是这样的
[d][d d d][d][d d d][d][d d d]...
问题是第一个三元组到第二个三元组的距离不是sizeof(std::tuple<double, double,double>)==3*sizeof(double)
的整数倍,因此我无法将交错的三元组数组解释为具有步幅的数组。
换句话说,给定一个粒子数组 particle ps[100]
, 我可以将成员的地址取到第一个元素 triple* v1P = &(ps[0].position)
我想要那个v1P + n == &(ps[1].position)
对于一些(整数)n
(我可以在编译时推断出,例如 n = sizeof(particle)/sizeof(tripe)
if sizeof(particle)%sizeof(tripe)==0
。)
强制三元组具有不同偏移量的最佳方法是什么?
我可以人工贴一些double
s 在中间以匹配偏移量:
struct particle{
double mass;
double garbage[2];
std::tuple<double, double, double> position;
}
所以内存看起来像这样
[d][* *][d d d][d][* *][d d d][d][* *][d d d]...
但是我不能使用初始值设定项 ( particle{1.,{1.,2.,3.}}
)。
我也可以把它加到最后
struct particle{
double mass;
std::tuple<double, double, double> position;
double garbage[2];
}
所以,我可以继续使用初始化程序。这是最好的方法吗?但它只适用于这种简单的情况。
另一种选择是强制对齐 struct
到 3*sizeof(double)
的一些倍数
struct alignas(3*sizeof(double)) particle{double mass; std::tuple<...> position;};
但问题是它不是 2 的幂,所以 GCC 和 clang 拒绝它。请注意,在其他大小的元组中 alignas
策略之所以有效,是因为它可以解决不小心成为 2 的幂的问题。
例如在
struct alignas(4*sizeof(double)) particle{double mass; std::pair<double, double> position;};
alignas
为这个其他用例(在 GCC 中)提供了一个简单的解决方案。
对此是否有通用或公认的解决方案?
我还发现了 ((packed)) , 在这个解决方案中是否也有必要?
我找到了这篇旧文章https://www.embedded.com/design/prototyping-and-development/4008281/2/Padding-and-rearranging-structure-members , https://web.archive.org/web/20190101225513/http://www.drdobbs.com/cpp/padding-and-rearranging-structure-member/240007649 .似乎在中间添加数组至少在当时是一种解决方案。此外,我可以使用 char[N]
以这种方式进行更精细的控制,达到字节级别。
最佳答案
在结构中间添加数组是为结构成员创建正确填充的传统方法,并且没有问题。我有一个 thread关于使用 ((packed))
和 ((aligned))
如果您想按自己的喜好调整结构。
我可能是错的,但我认为您想要实现的是某种未定义的行为,原因有两个。如果你想按照你描述的方式访问数组中的结构成员:
虽然,如果您将结构填充设置为 1(使用 ((packed))
)应该可以保证您想要执行的操作,但我个人并不建议这样做。
更新以下结构:
struct particle{
double mass;
__attribute__((aligned(2*sizeof(double)))) std::tuple<double, double, double> position;
};
给你类似的步伐:
struct particle{
double mass;
double garbage[2];
std::tuple<double, double, double> position;
}
但是自tuple<>
是非 POD,您不能使用 ((packed))
属性。刚刚收到这个警告,我自己正在尝试对其进行测试。
关于c++ - 对齐/偏移结构的特定成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57424150/
test = (function(){var key = 200; return {getKey : function(){return key} }; })(); test.
如果这个问题可能一直被问到,我很抱歉,但我进行了搜索,但找不到足够的答案。 如果公共(public)成员/方法正在访问私有(private)成员/字段,如何禁用它们的继承? 所以考虑一下: publi
重要的澄清:一些评论者似乎认为我是从 union 复制的。仔细查看 memcpy,它从一个普通的旧 uint32_t 地址复制而来,该地址不包含在 union 中。另外,我正在(通过 memcpy)复
spinner 通常只显示一个字符串,在我想分配 IDpersonne 和 Name 的情况下,旋转器必须告诉我名字。当我得到选定的项目时,我必须得到 ID。我该怎么做? 最佳答案 我假设您已将项目排
A 类的实例是 B 类的公共(public)成员。B 类的实例也是 A 的公共(public)成员。在什么情况下可能需要这种实现?我的意思是是否有一个或多个标准场景需要这种实现方式?更具体的细节:我有
我如何设置我的 web.config 以使用表单例份验证,将成员身份提供程序设置为 ActiveDirectoryMembershipProvider 并使用内置登录控件。这样我就可以使用有效的事件目
这个问题已经有答案了: Should methods in a Java interface be declared with or without a public access modifier?
因此根据定义,类中的私有(private)数字在序列化时以类名作为前缀。这对我来说是一个问题,我希望能够序列化/保存/反序列化一个确切的对象,但是 php 所做的是给我另一个 classname+va
我实现了一个成员? clojure 中的函数如下: (defn member? [item seq] (cond (empty? seq) false (= item (first
我在这里的问题似乎总是与使用函数有关。它仍然让我困惑!在本教科书练习中,我被要求按值传递结构,然后调整它并按引用传递。最初我设计的代码是在 main 中完成所有工作。现在我正在传递值。所以我添加了新函
所以我有这些变量 List files, images = new List(); string rootStr; 还有这个线程函数 private static int[] thread_searc
我对 C++ 模板和尝试弄清楚部分模板特化还比较陌生。我正在使用模板实现几个相关的数据结构:用于概率存在/不存在查询的布隆过滤器(基于位数组),以及用于丰度查询的计数布隆过滤器(带有整数数组)。我从以
例如在 java 中,我在外部类和内部类中声明并初始化了一个 JButton,我决定在某些情况下将其隐藏,这是一种安全的编程实践吗? 最佳答案 内部类的全部目的是它们可以访问到环绕内部类的外部类。 所
我有一个使用库进行通信的类: class Topic { Topic( Type T, String name ); }; class Reader { Reader (Topic, Stri
我在两个单独的文件中有以下代码。 package animal; public class Frog { protected void ribbit() { Syste
我有一个分数列表。使用这些,我需要从 redis 排序集中提取值。 我知道我可以使用 zrangebyscore - 但如果我提供的列表中的分数不连续怎么办?在这种情况下,我不能依赖 zrangeby
过去几年我一直被 C# 编码宠坏了,现在我又回到了 C++ 并发现我在处理本应很简单的东西时遇到了麻烦。我正在为 gamedev 使用名为 DarkGDK 的第三方库(任何以 db 为前缀的命令),但
我正在关注 Brian Harvey 从 2011 年开始在 UC Berkeley site 上的 SICP 讲座。 .他正在使用 STk interpreter教这门课,我正在使用带有 DrRac
在这段代码中,为什么在运算符重载中无法访问我的类的私有(private)字段? (请注意,这只是一个 MRE,不是完整代码) template class Frac template Frac o
在命名命名空间类中,我将一个类(位于全局命名空间中)声明为友元。 但是,后一个类不能访问前一个类的私有(private)成员。为什么是这样?有什么办法可以解决吗? Bob.h namespace AB
我是一名优秀的程序员,十分优秀!