Re[5]: Скорость получения байта по указателю
От: elcste  
Дата: 07.09.04 09:48
Оценка:
Здравствуйте, Sir Wiz, Вы писали:

SW>>>Нет, второй вариант тоже неправильный. Правый сдвиг отрицательных чисел определяется реализацией компилятора.


E>>В приведенном выше коде — surprise! — никогда не будет правого сдвига отрицательных чисел.

SW>(*pInt & 0xff000000) >> 24;


SW>Не будет, говорите? Это для x86.


Никогда — это значит никогда. В том числе для x86, конечно.

SW>Borland и VC сделают тут две разные вещи.


Что ж, если какой-то компилятор работает неправильно (что, правда, еще надо показать), стоит отправить bug report.

SW>А ещё есть вариации с low/big endian... Я не нашел в стандарте ни слова о требованиях к побитному расположению в памяти интегральных типов.


Стандарт, по большей части, внутреннее представление типов не регламентирует. А при чем тут это?
Re[5]: Скорость получения байта по указателю
От: elcste  
Дата: 07.09.04 09:54
Оценка:
Здравствуйте, Sir Wiz, Вы писали:

Ш>>>>Второй вариант правильный. Первый будет работать только на некоторых платформах.

E>>А почему, кстати?

SW>Например, отсутствие физической возможности обратиться к адресу не кратному 2^n, где n > 0.


Гм-гм... Вы, как и я, предполагаете, что типы BYTE и byte в примерах WinterMute — это синонимы unsigned char?
Re[6]: Скорость получения байта по указателю
От: Sir Wiz Россия  
Дата: 07.09.04 09:57
Оценка:
Здравствуйте, elcste, Вы писали:

SW>>>>Нет, второй вариант тоже неправильный. Правый сдвиг отрицательных чисел определяется реализацией компилятора.


E>>>В приведенном выше коде — surprise! — никогда не будет правого сдвига отрицательных чисел.

E>

SW>>(*pInt & 0xff000000) >> 24;


SW>>Не будет, говорите? Это для x86.


E>Никогда — это значит никогда. В том числе для x86, конечно.


Извольте, вот пояснение с картинками

int * pInt = new int;
*pInt = -1;
*pInt = *pInt & 0xFF000000; // *pInt == -16777216
*pInt >> 24; // Правый сдвиг отрицательного числа.


SW>>Borland и VC сделают тут две разные вещи.

E>Что ж, если какой-то компилятор работает неправильно (что, правда, еще надо показать), стоит отправить bug report.

Правильно работает. В соответствии со стандартом делает что хочет. В частности, VC сохраняет знак, Borland — нет.

SW>>А ещё есть вариации с low/big endian... Я не нашел в стандарте ни слова о требованиях к побитному расположению в памяти интегральных типов.


E>Стандарт, по большей части, внутреннее представление типов не регламентирует. А при чем тут это?


К тому, что побитные операции в принципе не переносимы. Поправьте, если это не так.
... << RSDN@Home 1.1.4 @@subversion >>
Re[6]: Скорость получения байта по указателю
От: Sir Wiz Россия  
Дата: 07.09.04 09:59
Оценка:
Здравствуйте, elcste, Вы писали:

E>Гм-гм... Вы, как и я, предполагаете, что типы BYTE и byte в примерах WinterMute — это синонимы unsigned char?


Да, точно подмечено. Не знаю, честно говоря. Но, видимо, да.
... << RSDN@Home 1.1.4 @@subversion >>
Re[7]: Скорость получения байта по указателю
От: elcste  
Дата: 07.09.04 10:22
Оценка: 23 (2) +2
Здравствуйте, Sir Wiz, Вы писали:

E>>>>В приведенном выше коде — surprise! — никогда не будет правого сдвига отрицательных чисел.

SW>>>(*pInt & 0xff000000) >> 24;

SW>*pInt = *pInt & 0xFF000000; // *pInt == -16777216
SW>*pInt >> 24; // Правый сдвиг отрицательного числа.

Найдите в картинках одно отличие.

Отгадка: Подвыражение *pInt имеет тип int, тогда как подвыражение *pInt & 0xff000000 в 32-разрядных компиляторах под x86 имеет тип unsigned int.

Литература: Читать про integer literals, integral promotions и usual arithmetic conversions.

SW>К тому, что побитные операции в принципе не переносимы. Поправьте, если это не так.


Побитовые операции над беззнаковыми типами в принципе переносимы. Побитовые операции над знаковыми типами имеют ряд опасных особенностей (которые, кстати, лучше описаны в стандарте C99, нежели C++).
Re[7]: Скорость получения байта по указателю
От: elcste  
Дата: 07.09.04 10:27
Оценка:
Здравствуйте, Sir Wiz, Вы писали:

E>>Гм-гм... Вы, как и я, предполагаете, что типы BYTE и byte в примерах WinterMute — это синонимы unsigned char?


SW> Да, точно подмечено. Не знаю, честно говоря. Но, видимо, да.


То есть вопрос о выравнивании исчерпан. Правильно я понимаю?
Re[8]: Скорость получения байта по указателю
От: Sir Wiz Россия  
Дата: 07.09.04 11:16
Оценка:
Здравствуйте, elcste, Вы писали:

E>Отгадка: Подвыражение *pInt имеет тип int, тогда как подвыражение *pInt & 0xff000000 в 32-разрядных компиляторах под x86 имеет тип unsigned int.


Сдаюсь. Правильно.
... << RSDN@Home 1.1.4 @@subversion >>
Re[6]: Скорость получения байта по указателю
От: JakeS  
Дата: 07.09.04 12:35
Оценка:
Здравствуйте, Sir Wiz, Вы писали:

SW>Здравствуйте, JakeS, Вы писали:


JS>>>>господа, елси уж для вашей программы существенна разница в скорости выполнения команды mov — Пишите нужный участок в чистом ассемблере, однозначно будет быстрее.


SW>>>Как правило интеловский, например, компилятор генерирует более качественный код. Так как учитывает особенности работы процессора.


JS>>В данном случае никакие особенности процессора ни при чем. речь идет всего лишь о доступе к участкам памяти. Очевидно что быстрее всего единственная операция mov регистр, адрес и в дальнейшем работа только с регистрами. Причем совершенно без разницы какой процессор.


SW>Не претендую на профессианлизм в этом вопросе, но как же конвейерная оптимизация?


Конвейерная оптимизация — это то, поведение чего никто не гарантирует и, кроме создателей, предсказать не может. Короче как морская свинка и не свинка, и не морская, но работает быстрее.
Re[3]: Скорость получения байта по указателю
От: Шахтер Интернет  
Дата: 07.09.04 16:32
Оценка: 8 (1)
Здравствуйте, Sir Wiz, Вы писали:

SW>Здравствуйте, Шахтер, Вы писали:



WM>>>
WM>>>int* pInt = ....;

SW>// Кусь

WM>>>BYTE first  = (*pInt & 0xff000000) >> 24;
WM>>>BYTE second = (*pInt & 0x00ff0000) >> 16;
WM>>>BYTE third  = (*pInt & 0x0000ff00) >> 8;
WM>>>BYTE fourth = (*pInt & 0x000000ff);
WM>>>


Ш>>Второй вариант правильный. Первый будет работать только на некоторых платформах.


SW>Нет, второй вариант тоже неправильный. Правый сдвиг отрицательных чисел определяется реализацией компилятора.

SW>Кроме того не гарантируется, что размер типа int будет равен 4-м байтам.

Как сказал автор, int 32 разрядный. Сколько он при этом занимает на самом деле байт -- не имеет значения.
Сдвигов отрицательных чисел в этом примере не будет. Потому что константе 0xFF000000, например, на машине, где int 32 разрядный, будет назначен тип unsigned int.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[7]: Скорость получения байта по указателю
От: Sir Wiz Россия  
Дата: 08.09.04 06:25
Оценка:
Здравствуйте, JakeS, Вы писали:

SW>>Не претендую на профессианлизм в этом вопросе, но как же конвейерная оптимизация?


JS>Конвейерная оптимизация — это то, поведение чего никто не гарантирует и, кроме создателей, предсказать не может. Короче как морская свинка и не свинка, и не морская, но работает быстрее.


AFAIK, поведение конвейеров описано в интеловской документации.

И в компиляторе Intel реализована оптимизация именно под их процессоры, учитывающая работу конвейеров, HT, и времени выполнения команд.

Пожалуй единственное, известное мне место, где приходится писать на ассемблере — MMX/SSE/SSE2/SSE3. Например при умножении матриц компилятор не всегда может сам векторизовать.
... << RSDN@Home 1.1.4 @@subversion >>
Re: Скорость получения байта по указателю
От: K13 http://akvis.com
Дата: 31.08.09 10:41
Оценка:
WM>Допустим, у меня есть указатель на 32-х битное целое, нужно получить в нём второй байт, какой код будет быстрее:

А нужен именно второй байт или все четыре распихать в разные стороны?
На входе указатель или само целое?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.