不属于任何类型的结构中的成员?和一个结构来保存一个单独的变量

Member in a struct that isn't attributed to any type? and a struct to hold a lone variable

我试图理解下面的代码,它用于在点云中保存 XYZ 和强度值的结构,字段 PCL_ADD_POINT4D 看起来像一个独立的语句,不是任何已知类型,那是什么意思?这是一种解决内容的方法吗?

struct EIGEN_ALIGN16 _PointXYZI
   {
    PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
     union
     {
       struct
       {
         float intensity;
       };
       float data_c[4];
     };
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
   };



这是来自 http://docs.ros.org/hydro/api/pcl/html/point__types_8hpp_source.html#l00382

什么是 PCL_ADD_POINT4D 以及 intensity 需要在结构中的明显原因。 干杯。

编辑:

正如@Beta 指出的那样 PCL_ADD_POINT4D 来自 here

在结构中包含 intensity 仍然很奇怪。 (如果有正当理由,我会留下这个问题)

PCL_ADD_POINT4D是在line 144 of the same file中定义的宏。它是大写字母的事实已经给了我们一个线索。

而且我看不出 intensity 需要在匿名结构中的原因,除了编译器特定的原因,也许。

第 1 部分:PCL_ADD_POINT4D 引用宏

PCL_ADD_POINT4D指的是下面几行

 #define PCL_ADD_POINT4D \
   union EIGEN_ALIGN16 { \
     float data[4]; \
     struct { \
       float x; \
       float y; \
       float z; \
     }; \
   }; \

这里 EIGEN_ALIGN16 是一个 SSE 宏,有助于优化点操作,因为它们通常应用于我们在这些中定义的类型的向量(在我们的例子中是点 vectors/clouds)上下文。

link 到源文件是 here

第 2 部分:容纳一个变量的结构

我认为这更像是一种令人赏心悦目的设计模式,我已经习惯了,因为我的眼睛越来越熟悉优秀的PCL library

在结构中,成员按顺序存储在相邻的内存位置,而在联合中,所有成员都从相同的位置开始并且确实具有重叠的性质(想象一下将不同大小(纵向)的字符串组合成一个长字符串 [struct] vs 从一个点悬挂不同长度的绳子(或绳子)[并集],在并集的情况下,整个东西的长度将是最长的一段绳子的长度。

我们可以利用这些特性为我们的新类型提供漂亮的紧凑外观,而这正是 PCL 的作者所做的。

struct point_xyz{
    union{
        float x;
        float y;
        float z;
        float padding; // redundant with data[4] already taking care of it
    };
    float data[4];
};

如果我们将 point_xyz 实例化为例如point1 我们可以通过 point1.data[0]point1.x 访问它的成员,我们也可以使用 .data 将点作为一个整体传递给喜欢它的函数。

那么这与原始问题有什么关系?

我认为这是因为这种点类型结构定义在 PCL 源中出现得非常规律,并且在声明强度时使用相同的蓝图只是为了让眼睛看起来容易。