我试图在我用C++ 11编写的同一应用程序中使用两个库LIBSVMLIBLINEAR。 LIBSVM和LIBLINEAR都以本质上是基于行的稀疏矩阵表示形式进行输入:存在节点结构

struct svm_node
{
    int index;
    double value;
};

稀疏矩阵本身就是struct svm_node **,其中每一行都是struct svm_node *,而行以index = -1终止。此结构的LIBLINEAR版本称为feature_node,并且具有相同的定义。尽管LIBSVM和LIBLINEAR由相同的作者编写,但svm.hlinear.h,因此struct svm_nodestruct feature_node毫无关联。

在某些情况下,我想为我的数据创建一个内核SVM模型(仅由LIBSVM实现)和一个逻辑回归模型(仅由LIBLINEAR实现)。数据集将以各自的格式(在二进制级别上是相同的)传递给库,它们的稀疏矩阵表示形式可能会很大,我宁愿避免使用memcpy()对其全部进行编码。一个简单的reinterpret_cast<feature_node **>(svm_node_ptr_ptr_variable)似乎可以很好地完成工作。

我还在发行版本中使用LLVM的全程序优化(-flto),所以我想确保没有任何无法中断的优化中断。

有什么方法可以将svm_node **键入feature_node **,从而避免由(当前或将来的)编译器优化引起的任何破损? __attribute__((__may_alias__))在这里有帮助吗?如果有帮助,我应该如何使用它?

如果__attribute__((__may_alias__))仅对类型有意义,那么如果我创建了自己的结构和指向结构的指针,它将起作用
struct __attribute__((__may_alias__)) SparseElement {
    int index;
    double value;
};
typedef SparseRow SparseElement * __attribute__((__may_alias__));

然后将retinterpret_castSparseRow *传递给LIBSVM和LIBLINEAR?

最佳答案



如果您使用 union ,那您就是金。 C++特别允许(第9.2节)访问“公共(public)初始子序列”。



指针上的reinterpret_cast都应该可以正常工作,因为经历从左值到右值转换的类型就是内存中存在的对象的确切类型。

10-07 12:03