c – 打破严格的走样和生活来讲述它?

c – 打破严格的走样和生活来讲述它?,第1张

概述我试图在我在C 11中编写的同一个应用程序中使用两个库 LIBSVM和 LIBLINEAR.LIBSVM和LIBLINEAR都将它们的输入用于基本上是基于行的稀疏矩阵表示:有节点结构 struct svm_node{ int index; double value;}; 稀疏矩阵本身只是struct svm_node **,其中每一行都是struct svm_node *,行以 我试图在我在C 11中编写的同一个应用程序中使用两个库 LIBSVM和 LIBLINEAR.liBSVM和liBliNEAR都将它们的输入用于基本上是基于行的稀疏矩阵表示:有节点结构
struct svm_node{    int index;    double value;};

稀疏矩阵本身只是struct svm_node **,其中每一行都是struct svm_node *,行以index = -1结尾.此结构的liBliNEAR版本称为feature_node,具有相同的定义.尽管liBSVM和liBliNEAR是由相同的作者编写的,但svm.h和linear.h以及struct svm_node和struct feature_node没有任何关系.

在某些情况下,我想创建一个内核SVM模型(仅由liBSVM实现)和一个逻辑回归模型(仅由liBliNEAR实现)我的数据.数据集传递给它们各自的库—在二进制级别上,相同的—稀疏矩阵表示,可能非常大,我宁愿避免memcpy()这一切.一个简单的reinterpret_cast< feature_node **>(svm_node_ptr_ptr_variable)似乎做得很好.

我还在发布版本中使用LLVM的完整程序优化(-flto),因此我希望确保代码不会以不可预测的方式进行优化.

有没有什么方法可以将type-pun svm_node **转换为feature_node **,以避免可能由(当前或未来)编译器优化引起的任何破坏? __attribute __((__ may_alias__))在这里有帮助,如果有,我应该如何使用它?

如果__attribute __((__ may_alias__))仅对类型有意义,那么如果我创建了自己的struct和指向struct的结构,它是否有效

struct __attribute__((__may_alias__)) SparseElement {    int index;    double value;};typedef SparseRow SparseElement * __attribute__((__may_alias__));

然后将retinterpret_casted SparseRow *传递给liBSVM和liBliNEAR?

解决方法

The liBliNEAR version of this struct is called feature_node and has IDentical deFinition.

如果你使用工会,你就是金. C特别允许(第9.2节)访问“共同的初始子序列”.

If a standard-layout union contains two or more standard-layout structs that share a common initial sequence,and if the standard-layout union object currently contains one of these standard-layout structs,it is permitted to inspect the common initial part of any of them. Two standard-layout structs share a common initial sequence if corresponding members have layout-compatible types and either neither member is a bit-fIEld or
both are bit-fIElds with the same wIDth for a sequence of one or more initial members.

即使是指针上的reinterpret_cast也应该可以正常工作,因为经过左值到右值转换的类型是存储在那里的对象的确切类型.

总结

以上是内存溢出为你收集整理的c – 打破严格的走样和生活来讲述它?全部内容,希望文章能够帮你解决c – 打破严格的走样和生活来讲述它?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存