首页 > 解决方案 > 一个结构在 ; 之前有一个联合是什么意思?

问题描述

正如您在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;

这是什么意思?

标签: c++

解决方案


这将取决于数据结构对齐。在某些平台上,将结构数据对齐到 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. 

推荐阅读