c++ - 一个结构在 ; 之前有一个联合是什么意思?
问题描述
正如您在PointHVDIR
结构中看到的那样,它以EIGEN_ALIGN16
.
#define PCL_ADD_UNION_POINT4D_HVD \
union EIGEN_ALIGN16 { \
float data[4]; \
struct { \
float h; \
float v; \
float d; \
}; \
};
struct PointHVDIR
{
PCL_ADD_POINT4D_HVD; // quad-word HVD
float intensity; ///< laser intensity reading
uint16_t ring; ///< laser ring number
EIGEN_MAKE_ALIGNED_OPERATOR_NEW // ensure proper alignment
} EIGEN_ALIGN16;
这是什么意思?
解决方案
这将取决于数据结构对齐。在某些平台上,将结构数据对齐到 16、32 或 64 字节可能是有利的(因此您可以执行对齐的 SIMD 读/写)。这就是宏的用武之地。从 C++11 及以后,您可以使用 alignas() 运算符来执行此操作:
struct alignas(16) Vec4
{
float x,y,z,w;
};
但是,在 C++11 之前,您必须使用编译器特定的扩展来对齐数据类型,例如使用 Visual C++:
struct __declspec(align(16)) Vec4
{
float x,y,z,w;
};
或使用 gcc/linux。
struct __attribute__((aligned(16))) Vec4
{
float x,y,z,w;
};
为了解决这种混乱,大多数库最终会将变体包装在宏中:
#if __cplusplus >= 201103
# define ALIGN(X) alignas(x)
#elif defined(_MSC_VER)
# define ALIGN(X) __declspec(align(16))
#else
# define ALIGN(X) __attribute__((aligned(16)))
#endif
这导致结构定义如下:
struct ALIGN(16) Vec4
{
float x,y,z,w;
};
在上面的代码中,由于外部 PointHVDIR 结构已被标记为 16 字节对齐,因此对齐匿名联合也是多余的。可以通过以下方式使代码更具可读性:
#define PCL_ADD_UNION_POINT4D_HVD \
union { \
float data[4]; \
struct { \
float h; \
float v; \
float d; \
}; \
};
struct PointHVDIR
{
PCL_ADD_POINT4D_HVD;
float intensity;
uint16_t ring;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW //< ensure alignment when calling new
} EIGEN_ALIGN16; //< ensure alignment within structs, and on the stack.
推荐阅读
- php - 此集合实例上不存在属性 [id] [details] [details] [amount]
- internet-explorer - iframe 未加载具有相同域名的页面
- react-native - undefined 不是对象(评估 'object.keys(routeConfigs)')
- python - Elasticsearch解析异常400
- c++ - 优化/减少if语句中的条件表达式
- azure-devops - 发布代理运行的 Powershell 脚本抛出异常,因为缺少 .net 标准 2.0
- flutter - 不要在 toJson() 中解析空值
- c++ - 确定 IShellItemArray 中的所有项目是否来自同一目录
- c# - '当前的 SynchronizationContext 不能用作 TaskScheduler。' 在控制台应用程序中
- google-analytics - 子句嵌套的 BigQuery 与预期不符