Я вижу поведение при компиляции с GCC, что подразумевает, что GCC достаточно умен, чтобы оптимизировать вызовы в одной и той же «области» (я использую этот термин здесь свободно, поскольку область действия шире, чем C++ строго относится к сфере действия), чтобы согрешить и созреть в один призыв к sincos.GCC оптимизирует sinl и cosl для sincosl
В частности, для long double x
, sinl(x)
и cosl(x)
получить оптимизированный для sincosl(x, x)
вызова.
Я уверен, что это то, что происходит, поскольку я могу прокомментировать либо грех, либо соз, и получить вызов просто соз или грех соответственно. Аналогично, если я изменяю параметр, то снова получаю отдельные вызовы sin и cos.
Это проблема для меня, поскольку библиотека C, с которой я связываюсь, не реализует sincosl. Поэтому мне действительно нужны отдельные функции.
Мое утверждение верно? Может ли кто-нибудь указать мне на документацию для этого поведения? Может ли он быть отключен?
FYI Я использую:
i686-NaCl-gcc.exe --version x86_64-NaCl-GCC (GCC) 4.4.3 20141209 (Native Client r14192, Git Commit 7faaabb9f10e6dcae5f2b799da43e236e65cda95) Copyright (C) 2010 Free Software Foundation, Inc.
Однако я не ожидаю, что это будет конкретная версия. Вероятно, общее поведение GCC (возможно, я предполагаю, что арка/цель).
Можете ли вы предоставить [MCVE] (https://stackoverflow.com/help/mcve)? Вас также может заинтересовать этот [отчет об ошибках] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46926). – tangrs
Ха, спасибо. Я просто нашел это. Я не могу использовать -ansi, поскольку у проекта нет никаких шансов в этих настройках. MCVE может быть сложным, поскольку я использую нестандартную инструментальную цепочку. Я могу попытаться выполнить репо с версией на полке, но никаких обещаний относительно скорости, с которой я это делаю :( –
Я просто экспериментирую с различными «обходными решениями». Я обнаружил, что добавление 2 * M_PI к одному аргументу работает :) , Не уверен, что я особенно доволен этим! –