Временно отключить оптимизацию константных переменных? (во время отладки) - PullRequest
1 голос
/ 28 апреля 2020

У меня есть сложная структура (к сожалению, я не могу переписать ее, отсюда и мой вопрос), которую я написал для собственного использования, и она предполагает интенсивное использование массивов с плавающей точкой.

Эти массивы с плавающей точкой передаются как const float* между многими функциями и объектами.

Однако мне нужно выполнить специальную процедуру отладки ("проверку градиента" для нейронных сетей) в спецификациях. c областей моего кода. Это позволяет мне видеть, приведет ли ручное возмущение моих записей массива к ожидаемому изменению значения позже, в другом месте. Если нет, то я допустил ошибку в промежуточных формулах.

Я написал инструмент, который принимает массив const и возмущает некоторые его значения.

В результате, во время этой процедуры временной отладки я приведу эти const float* к float*, используя переинтерпретацию. Это ужасно и ведет к неопределенному поведению. Я изменяю значения внутри константных массивов и молюсь, чтобы они не ломались при запуске этой отладочной версии (это не половина времени).

Вопрос:

Можно ли временно запретить компилятору оптимизировать код везде, где он видит const float*, просто чтобы дать мне возможность отладить мой код с помощью моего инструмента проверки?

Другими словами, чтобы я мог безопасно привести const float* к float* на данный момент.

Есть ли какой-нибудь #define, который я мог бы использовать в своем коде или флаге компилятора для Visual Studio?

Я использую c ++ 17 и Visual Studio


Редактировать после принятия ответа

На этот раз проблема не была в гипсе, но во что-то перезаписывает память вне массива. С помощью точки останова Memory Watch в Visual Studio и стека вызовов я смог отследить место, где это происходило

1 Ответ

2 голосов
/ 28 апреля 2020

Я использовал эти констатные плавающие * для плавающих *, используя переинтерпретацию. Это ужасно и ведет к неопределенному поведению.

Отбрасывание квалификатора const само по себе не приводит к неопределенному поведению. Вы можете использовать const_cast<float*> для удаления квалификатора const , если вы знаете, что указанный объект не является константным . Вы должны объявить сам массив, который имеет неконстантное хранилище.

Можно ли временно запретить компилятору оптимизировать код везде, где он видит const float *, просто чтобы дать мне возможность отладить мой код через мой инструмент проверки?

const - это не функция оптимизации, а функция безопасности типа. Если ваш компилятор неявно преобразует const float* в float*, это не совместимый компилятор C ++.

Есть ли какой-то #define, который я мог бы использовать в своем коде, или флаг компилятора для Visual Studio?

Если вам нужно скомпилировать этот код для обоих случаев, вы можете использовать typedef для достижения этой цели:

typedef float *flt_ptr;
//or
typedef const float *flt_ptr;

Вы все равно должны правильно объявить хранилище в вашем массиве ( неконстантный при использовании первого typedef).

Многие люди считают typedef указатели нечитаемыми и подверженными ошибкам (вы должны помнить, что теперь не используйте * во всех ваших указателях). Возможно, вам лучше всего использовать ограниченное число const_cast в ключевых местах и ​​убедиться, что исходный массив не является константным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...