Сколько памяти умножить на двойную int? - PullRequest
1 голос
/ 26 мая 2019

Сколько памяти умножает 16-разрядное целое число без знака на двойное и назначает его другому 16-разрядному целому числу без знака в C?Будет ли он временно загружать двойной результат в регистр, прежде чем присваивать ему int?Я занимаюсь программированием для встраиваемых систем, поэтому спрашиваю.

u16int_t a = 3;
u16int_t b = a * .4;

Ответы [ 2 ]

4 голосов
/ 26 мая 2019

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

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

Чтобы избежать этого, вы можете использовать целочисленную арифметику:

u16int_t a = 3;
u16int_t b = a * 4 / 10;
3 голосов
/ 26 мая 2019

Выполнить 2 *sizeof(double), чтобы узнать.Коду нужно временно хранить (удваивать) a как неявное приведение, а другое - как .4.Обычно доступно два свободных регистра, а фактическая стоимость равна нулю, но их может и не быть.

Обратите внимание, что эта память выделена в стеке, поэтому эффективная стоимость памяти, вероятно, равна нулю.Компилятор действительно хорош в повторном использовании временных слотов памяти, и вряд ли это будет из-за глубины стека.

Если u16int_t a = 3 действительно постоянный фрагмент кода, а не артефакт сокращения, компилятороптимизирует все до u16int_t b = floating point constant и снова выделяет нулевые байты для умножения.

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