如何解决错误 C2719 在 Visual Studio 2010 C++ 中不存在代码行时

How to solve error C2719 in visual studio 2010 c++ when no code line exist in code

本文关键字:C++ 2010 Studio 不存在 代码 Visual 何解决 解决 C2719 错误      更新时间:2023-10-16

我正在构建一个从同事那里收到的项目。我收到以下错误:

..\HelperFunctions\disp.cpp(130):错误 C2719:"视点":带有 __declspec(align('16')) 的形式参数不会对齐

我正在按照线索disp.cpp第 130 行,只是发现这是一个函数的结尾,而这一行我所拥有的只是:

}

在此链接之后,我的理解可能是函数定义的问题,但我无法完全理解是否有任何问题。我已经注释了函数中所有不必要的元素,并将其简化为:

std::vector< int > HPR (typename pcl::PointCloud<PointT>::ConstPtr source,pcl::PointXYZ viewpoint, double param)
{
//commented section
std::vector< int > indices;
//commented section
return indices;
}

仍然收到相同的错误。

  • 我错过了什么?
  • 我该如何解决这个问题?

附言 我是C++新手,并使用PCL API在Visual Studio 2010上工作。

在谷歌搜索pcl::PointXYZ后,我发现它实际上是基于特征库的。(我在源代码中看到了很多EIGEN宏。

EIGEN 库尝试使用特殊的 SSE 指令来获得最佳性能。AFAIK,这些 SSE 指令要求数据必须正确对齐(例如,地址是 16 的倍数)。

这可能会干扰函数参数的传递

std::vector<int> HPR(
typename pcl::PointCloud<PointT>::ConstPtr source,
pcl::PointXYZ viewpoint, double param);

当调用函数时,参数可能会在 CPU 寄存器中传递,但通常(特别是在英特尔的 x86 CPU 上)它们被推送到堆栈,函数使用某个基本指针访问它们,对于英特尔的 CPU,例如获取 BP 寄存器(16 位)、EBP(32 位)或 RBP(64 位)。

更多关于这个关于这个 Eli Benderskys 堆栈框架布局在 x86-64 上。

但是,将数据推送到堆栈可能不允许根据需要对齐数据(在不破坏被调用函数的"二进制签名"的情况下)。因此,编译器抛出错误 C2719。

如果函数的第 2参数从值更改为引用,则意味着将移交原始变量的引用。(虽然这在技术上可能不完全正确,但我认为它是交出原始变量的地址而不是堆栈上的副本。为防止意外覆盖引用变量的内容,可以使用const引用:

std::vector<int> HPR(
typename pcl::PointCloud<PointT>::ConstPtr source,
const pcl::PointXYZ &viewpoint, double param);

由于引用,使用的原始变量要么正确对齐(要么会在源代码的另一行上导致另一个错误)。作为参考,不再需要特殊对齐。

使用const(或非const)引用而不是值可能会产生额外的积极性能效果。如果参数类型的大小明显大于"机器字"(即适合寄存器的东西),则值得传递引用而不是复制值。考虑以下情况pcl::PointXYZ可能就是这种情况:

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

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

struct EIGEN_ALIGN16 PointXYZ : public _PointXYZ

(根据float[4],它应该消耗16字节。

相反,不值得考虑对基元类型的引用,如boolint和任何指针(通常应该适合"机器字"宽度)。