Промежуточные выражения в GCC (если так они называются) - PullRequest
1 голос
/ 17 июля 2010

Я пытаюсь преобразовать математическую библиотеку, написанную на VS, чтобы она компилировалась через GCC. Проблема в том, что у меня много перегруженных операторов, которые выглядят так:

template<code><typename T>
встроенный кватернион <T> оператор + (кватернион <T> & a, кватернион <T> & b)
{вернуть кватернион <T> (a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);}

и т. Д.

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

...<br/> quaternion<code><T> q = log (exp (q0) * t);
...

Без них вышеперечисленное должно было бы превратиться в:

...<br/> quaternion<code><T> tmp = exp (q0);
tmp * = t;
кватернион <T> q = log (tmp);
...

И это всего лишь простой пример. Некоторые выражения в системах, использующих эту библиотеку, расширились бы до нескольких сотен строк - что довольно неприятно, учитывая, что накладные расходы, связанные с отладкой числового кода в стиле ассемблера, скажем, для одной функции, которая растягивается на 600 строк, астрономичны минимум.

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

Но, конечно, я надеюсь, что ошибаюсь, предполагая это.

Что заставляет меня спросить: есть ли у GCC возможность создавать автоматические промежуточные звенья? Если нет, то какие компиляторы, кроме брендов MS, способны на это?

Или я совсем ошибся в этом и есть лучшая техника для создания того же эффекта?

Ответы [ 2 ]

4 голосов
/ 17 июля 2010

Ваши неизменяющие операторы должны принимать свои аргументы по ссылке const , например,

template<typename T>
inline quaternion<T> operator+(const quaternion<T> &a, const quaternion<T> &b)
{return quaternion<T>(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);}

Стандартный C ++ не позволяет вам связывать безымянные временные значения (которые являются вашими промежуточными значениями) с неконстантными ссылками. Похоже, что MSVC ++ мог бы разрешить это как расширение.

3 голосов
/ 17 июля 2010

Код, который вы показали, должен , а не , требующий переписывания для gcc или любого другого правильно работающего компилятора C ++.C ++ требует, чтобы компилятор мог генерировать временные файлы (то, что вы называете промежуточными звенами), включая те, которые вы показали.Хотя есть некоторые различия между тем, что примет gcc, и тем, что примет VC ++, они обычно довольно незначительны (как правило, VC ++ принимает код, который теоретически не должен).В приведенном выше коде вы имеете именно это: вы передаете аргументы по неконстантной ссылке, но предполагается, что временные данные могут передаваться только по значению или константной ссылке.Измените это, и gcc должен принять код.

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

...