如何解决错误 C2719 在 Visual Studio 2010 C++ 中不存在代码行时
How to solve error C2719 in visual studio 2010 c++ when no code line exist in code
我正在构建一个从同事那里收到的项目。我收到以下错误:
..\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字节。
相反,不值得考虑对基元类型的引用,如bool
、int
和任何指针(通常应该适合"机器字"宽度)。
- 无法在 Visual Studio 2010 中构建 Allegro C++ 程序
- Visual Studio 2013,错误 MSB8020:找不到 Visual Studio 2010 的生成工具
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 双线程应用比单线程应用慢 C++ (VC++ 2010 Express).如何解决?
- std::array initalization with Visual Studio 2010
- MSVC 2010 编译应用程序和 MSVC 2019 编译应用程序之间的行为差异
- 将代码从 32 位迁移到 64 位时出现问题 Visual Studio 2010
- 在 Visual Studio 2010(及更高版本)中定义包含或链接路径变量的位置
- Visual Studio 2010 单元测试:无法识别引用的项目类
- Visual Studio 2010 - C++ 致命错误 LNK1120: 1 个未解析的外部
- VisualStudio 2015 链接器查找 VS 2010 库
- C /FORTRAN项目由Visual Studio 2010/Intel 2013创建,将不会在Visual St
- 如何使 Visual Studio 2010 警告未使用的变量
- 如何解决错误 C2719 在 Visual Studio 2010 C++ 中不存在代码行时
- 代码 c++ VS 2010 中的 LPCWSTR 到字符串转换问题
- 按值传递的参数在 Visual Studio 2010, C++ 的调试器中显示为通过引用传递
- Visual Studio 2010 是否执行零初始化
- 从另一个CPP文件访问Form1的文本框,Visual C 2010
- 无法使用 Visual Studio 2010 和 Qt 版本 4.8.0 创建"Qt Gui Application"
- 从 Visual C++ 2010 中的单独线程调用消息框