Есть некий буфер unsigned char *buf;
нужно заполнить его int'ами или float'ами.
как это сделать корректно в рамках strict-aliasing'a,
сразу приходит в голову такое:
Здравствуйте, Аноним, Вы писали:
А>но может есть способ как без memcpy, но со strict-aliasing?
Ну можно выкрутиться с union -- он позволит трактовать int как два байта и присвоить их по одному в нужные места. Но я бы уж лучше нарушил этот самый strict aliasing, чем занимался таким извращением.
Здравствуйте, Tilir, Вы писали:
T>Здравствуйте, Аноним, Вы писали:
А>>но может есть способ как без memcpy, но со strict-aliasing?
T>Ну можно выкрутиться с union -- он позволит трактовать int как два байта и присвоить их по одному в нужные места. Но я бы уж лучше нарушил этот самый strict aliasing, чем занимался таким извращением.
T>Полезная ссылка на список большего количества трюков: http://www.cellperformance.com/mike_acton/2006/06/understanding_strict_aliasing.html
статью читал.
как выкрутиться с юнионом в случае с когда есть указатель на буфер чаров куда надо писать не понимаю..
Здравствуйте, Аноним, Вы писали:
А>как выкрутиться с юнионом в случае с когда есть указатель на буфер чаров куда надо писать не понимаю..
Записать int в этот юнион, а оттуда байты прочитать.
А чем тебе memcpy не нравится? Ведь тебе нужна именно её семантика?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Как корректно заполнить буфер char*
От:
Аноним
Дата:
17.03.09 14:07
Оценка:
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Аноним, Вы писали:
А>>как выкрутиться с юнионом в случае с когда есть указатель на буфер чаров куда надо писать не понимаю.. E>Записать int в этот юнион, а оттуда байты прочитать.
E>А чем тебе memcpy не нравится? Ведь тебе нужна именно её семантика?
думаю, что такая операция должна делаться двумя инструкциями, а не вызовом crt функции.
хотя понимаю, что не факт, что код сгенеренный с юнионом или без strictalias'a (*(int *) = 123) будет эффективней.
(предвидя следующий вопрос: да, мне важна скорость при этом
Здравствуйте, Аноним, Вы писали:
А>думаю, что такая операция должна делаться двумя инструкциями, а не вызовом crt функции. А>хотя понимаю, что не факт, что код сгенеренный с юнионом или без strictalias'a (*(int *) = 123) будет эффективней. А>(предвидя следующий вопрос: да, мне важна скорость при этом
Что касается скорости: memcpy, memset и некоторые другие вполне могут быть встроены компилятором (например, при включённой оптимизации):
#include <iostream>
#include <cstdio>
int main () {
unsigned char buffer[ 100 ];
int a = 0xdeadface;
std::puts ( "begin" );
std::memcpy ( &buffer[ 0 ] + 50, &a, sizeof ( int ) );
std::puts ( "end" );
}
Здравствуйте, Alexey F, Вы писали:
AF>Что касается скорости: memcpy, memset и некоторые другие вполне могут быть встроены компилятором (например, при включённой оптимизации):
да, часто компилятор вставляет инлайн для этих ф-ий. тем не менее, для x86 при больших расстояниях, memcpy, memset и тп эффективней этого самого инлайн.