В моем сетевом приложении в полученном буфере я хочу использовать смещение как указатель на известную структуру. Копирование каждого поля структуры с memcpy() 2 раза (rx/tx) является тяжелым. Я знаю, что мой gcc 4.7.2 (опция: -O3) на cortex-a8, do memcpy (& a, & buff, 4) в 1 команде без знака. Итак, он может получить доступ к unaligned int. Предположим, что у него может быть много структуры или большой структуры. Каков наилучший способ сделать это?Как использовать структуру в неуравновешенном буфере
struct __attribute__ ((__packed__)) msg_struct {
int a; //0 offset
char b; //4 offset
int c; //5 offset
int d[100]; //9 offset
}
char buff[1000];// [0]:header_size [1-header_size]:header [header_size+1]msg_struct
func() {
struct msg_struct *msg;
recv ((void *)buff, sizeof(buff));
msg=buff+header_size; // so, it is unaligned.
...
// some work like:
int valueRcv=msg->c;
//or modify buff before send
msg->c=12;
send(buff,sizeof(buff));
}
Работает ли это с 'buff' как массив' int '? Добавление 'header_size' приведет к тому, что ваш указатель окажется в неправильном месте. – dasblinkenlight
Убедитесь, что вы понимаете, как работает арифметика указателя. –
Параметры компилятора? Если вы не предприняли действия, чтобы заставить компилятор упаковать эту структуру, он будет использовать естественное выравнивание для полей - это, вероятно, не то, что вы хотите. – marko