Нарушать строгий псевдоним и жить, чтобы рассказать об этом?

Я пытаюсь использовать две библиотеки, LIBSVM а также LIBLINEAR в том же приложении, которое я пишу в C ++ 11. И LIBSVM, и LIBLINEAR принимают свое участие в том, что по сути представляет собой представление с разреженной матрицей на основе строк: существует структура узлов

struct svm_node
{
int index;
double value;
};

и сама разреженная матрица просто struct svm_node **где каждый ряд struct svm_node *и строки заканчиваются на index = -1, БИБЛИОТЕЧНАЯ версия этой структуры называется 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) в сборках релизов, поэтому я хотел бы обеспечить непредсказуемое прерывание оптимизации кода.

Есть ли способ типа каламбур 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_castиздание SparseRow * в ЛИБСВМ и БИБЛИОТЕКА?

7

Решение

LIBLINEAR версия этой структуры называется feature_node и имеет идентичное определение.

Ты золотой, если ты используешь союз. C ++ специально разрешает (раздел 9.2) доступ к «общей начальной подпоследовательности».

Если объединение стандартной компоновки содержит две или более структур стандартной компоновки, которые совместно используют общую начальную последовательность, и если объект объединения стандартной компоновки в настоящее время содержит одну из этих структур стандартной компоновки, разрешается проверять общую начальную часть любой из них. Две структуры стандартного макета имеют общую начальную последовательность, если соответствующие элементы имеют типы, совместимые с макетом, и ни один из элементов не является битовым полем или
оба являются битовыми полями одинаковой ширины для последовательности из одного или нескольких начальных элементов.

Даже reinterpret_cast указатель должен работать нормально, поскольку тип, который подвергается преобразованию из lvalue в rvalue, является точным типом объекта, который существует в памяти.

3

Другие решения


По вопросам рекламы [email protected]