【问题标题】:Cleaner way to convert an array of compact float values into an array of floats将紧凑型浮点值数组转换为浮点数数组的更简洁方法
【发布时间】:2020-08-06 01:07:36
【问题描述】:

在实际提问之前,小前奏。我不关心安全,我关心性能。我知道这不合适,而且我知道这很 hacky,但是这非常快。

vector<float> result = move(*((vector<float>*)&vertices));

该代码滥用 C 样式强制转换和指针来强制编译器解释左侧数组 vertices,这是一个紧凑类型的向量,其中所有字段都是浮点数作为浮点数数组。

struct vertex {
   float x;
   float y;
   float z;
}
vector<vertex> vertices;

这可以工作并且可以满足需要,但是有点难以阅读。我想知道是否有另一种方法可以以更易读的方式实现相同的结果。

【问题讨论】:

  • 我会说 vector::resize 加上 std::memcpy 应该可以在没有所有演员表的情况下解决问题
  • 这实际上复制了数据,但据我所知,我在上面发布的内容并没有做任何复制,它重新解释了一个指针。即据我所知,sn-p 应该是恒定的
  • 如果向量存储它的大小而不是结束指针,您的代码将无法工作。但是,如果您的代码恰好可以工作,它可能会比定义明确的解决方案具有更好的性能。

标签: c++ pointers vector types casting


【解决方案1】:

你应该更关心的是你的代码的行为是 undefined 因为强制转换违反了 strict aliasing 规则。请注意,vector&lt;vertex&gt;vector&lt;float&gt; 是一个完全不同的类型。

特别是您假设struct 中的数据是连续的,并且struct 中没有填充,即使在末尾也是如此。

为什么不从一开始就使用vector&lt;float&gt;,并提醒自己第四个元素开始下一个三角形,依此类推?

【讨论】:

  • 因为这段代码试图处理通用数据,所以唯一的要求是结构定义是连续的并且没有填充。任何遵守这一点的任意结构都应该是我正在构建的方法的有效输入
  • 即便如此,您仍然处于未定义的行为领域。例如,我想知道 gcc 如何将优化提升到最大值。
  • 如果这打破了这一点,那么您可以使用编译器指令来禁用该 sn-p 的优化。只要这个 UB 在它需要工作的 4 个系统中工作,即使它在未来发生故障,我也可以
  • 似乎您想对 C++ 标准进行一次很好的老拳头。如果我是你,我不会那样做!
  • @Makogan 您如何确切地知道“禁用优化”在您当前使用的编译器或未来版本中的作用?
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2013-08-19
  • 1970-01-01
相关资源
最近更新 更多