更新:6个月后,我刚遇到以下答案:索引到结构是否合法?:Slava回答。我认为这是比此处提供的任何解决方案都更好的解决方案,因为绝对没有未定义的行为。希望这对下一个人有所帮助,因为现在实施我已经太迟了。
在您发表评论告诉我使用数组或向量或任何形式的容器之前,这是我不能接受的硬道理。我知道,这可以通过数组来解决,否则任何解决方案都是相当“ hacky”的。我很想使用一个容器,但是我绝对不能。
我是一家大型公司的中级开发人员,我们正在使用公司范围的库通过以太网发送数据。为什么它不能支持数组/向量,有多种原因,而是使用POD的结构(普通旧数据-字符,浮点数,整数,布尔值)。我从浮点数组开始,我必须使用浮点数组来填充具有相同数量的浮点的结构。由于该库的目的是通过以太网发送消息,因此我只需要进行两次迭代-一次在发送时一次在接收时一次。在所有其他时间,此数据都存储为数组。我知道-我应该对数组进行序列化并按原样发送它们,但是我重复一遍-我绝对不能。
我有一个float[1024]
,并且必须遍历数组并填充以下结构:
struct pseudovector
{
float data1;
float data2;
float data3;
...
float data1024;
}
我已经使用BOOST_PP_REPEAT和BOOST_PP_SEQ_FOR_EACH_I生成了该结构,因此我不必写出所有1024个浮点数,并且它增加了可维护性/可扩展性。
以相同的方式,我尝试通过预编译器##
关联(https://stackoverflow.com/a/29020943/2066079)遍历该结构,但是由于此操作是在预编译时完成的,因此无法用于运行-时间获取/设置。
我已经看过如何实现反射,例如如何向C ++应用程序添加反射?和Ponder Library,但是这两种方法都要求您显式地写出可以反映的每个项目。在这种情况下,我不妨std::map<string, float>
通过字符串/整数串联在for循环中创建一个and进行迭代:
for(i=0;i<1024;i++)
{
array[i] = map.get(std::string("data")+(i+1))
}
谁能推荐一种更清洁的解决方案,不需要我写出超过1024行的代码?感谢您的帮助!
再次,我重复一遍-我绝对不能使用任何类型的数组/向量。
这可能比您预期的要容易。首先,一些警告:
按照标准,数组可以保证是连续的。也就是说,它们之间没有插入填充,并且数组本身与元素类型的对齐要求对齐。
结构没有这样的限制。它们可以任意填充。但是,给定的实现(给定的版本)将在所有翻译单元中以相同的方式执行此操作(否则,将如何使用相同的结构定义在翻译单元之间传递数据?)。通常这样做是相当明智的,尤其是当该结构仅包含单个类型的成员时。对于这样的结构,对齐方式通常与成员的最大对齐方式匹配,并且由于所有成员都具有相同的对齐方式,因此通常不存在填充。
就您而言,您的1024个float数组和具有1024个float成员的结构几乎可以肯定具有完全相同的内存布局。该标准绝对不能保证,但是您的编译器可能会记录其结构布局规则,并且您始终可以在单元测试中声明大小和对齐方式匹配(您确实有单元测试,对吗?)
有了这些注意事项,您几乎肯定可以在两者之间简单地reinterpret_cast
(或memcpy
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句