Есть ли разница в поведении компилятора для каждого из этих фрагментов? - PullRequest
3 голосов
/ 09 апреля 2010

Пожалуйста, рассмотрите следующий код:

1

uint16 a = 0x0001;

if(a < 0x0002)
{
    // do something
}

2

uint16 a = 0x0001;

if(a < uint16(0x0002))
{
    // do something
}

3.

uint16 a = 0x0001;

if(a < static_cast<uint16>(0x0002))
{
    // do something
}

4

uint16 a = 0x0001;
uint16 b = 0x0002;

if(a < b)
{
    // do something
}

Что компилятор делает в backgorund и как лучше (и правильно) выполнить тестирование выше?

p.s. извините, но я не смог найти лучшего названия:)

EDIT:

значения 0x0001 и 0x0002 являются только примерами. Вместо этого может быть любое 2-байтовое значение.

Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 09 апреля 2010

Последний пример лучше всего подходит для кода, так как вам не следует использовать «магические константы» в вашем коде.

На самом деле, лучшим способом было бы сделать b const, (редактировать) и использовать значимые имена:

uint16 currentSpeed = 0x0001; 
const uint16 cMaxSpeed = 0x0002; 

if (currentSpeed < cMaxSpeed) 
{ 
    // do something 
} 

Кроме этого, между вашими примерами очень мало различий "под капотом".

3 голосов
/ 09 апреля 2010

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

В C ++ лучше использовать static_cast, а не приведения в стиле C. Я уверен, что, возможно, есть другие вопросы о том, почему это так, но лучшая ссылка здесь - Мейерс (Effective C ++). По этой причине, предпочтите 3 над 2, но 3 все еще страдает от проблемы магического числа.

Лучше всего четыре, за исключением того, что имена переменных не имеют смысла, и может иметь смысл, если одна или обе переменные будут const.

Я не уверен, есть ли какая-либо разница между ними с точки зрения скомпилированного кода, но это может быть связано с тем, что литерал интерпретируется как нечто отличное от uint16. Это может быть, например, uint32, хотя вы все равно должны получить ожидаемый результат.

2 голосов
/ 09 апреля 2010

Если это все, разницы нет (GCC, -O2). Во всех случаях //do something просто выполняется безоговорочно.

Так что это просто вопрос стиля.

1 голос
/ 09 апреля 2010

Поскольку числа, с которыми вы работаете, состоят из одной цифры и меньше 10, нет разницы между десятичной и шестнадцатеричной числами. Если вы не определили uint16 неожиданным образом, приведение и / или static_cast не должно иметь никакого значения. Не должно быть реальной разницы между непосредственным использованием константы и инициализацией переменной, а затем ее использованием.

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

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