LINUX.ORG.RU

c++: элемент структуры с признаком packed, передавать по указателю или по ссылке?

 


0

1

На новой версии компилятора GCC мой прежний исходник стал выдавать предупреждение:

tacking addres of packed memeber ...
при взятии адреса на элемент структуры с признаком packed.

Вопрос, как правильно передавать в процедуры упакованные элементы для их модификации?

На взятие адреса он предупреждает, на взятие ссылки он вообще ругается.

Вопрос, как правильно передавать в процедуры упакованные элементы для их модификации?

Не использовать упакованные элементы - это самое правильное.

Если тебе просто заткнуть компилятор, то просто добавляй каст (void*), а потом на нужный тип:

(int *)(void *)&my_packed_struct.some_int

Но это будет работать на Intel/AMD, а на всяких arm будет ошибка шины скорее всего…

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

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Не то слово! Иногда лучше молчать чем говорить писать на русском, который знаешь, чем на английском, который не знаешь. Как по мне это сразу выдает самоуверенность + неграмотность человека. Хотя, возможно, в своей тусовке человек вес имеет.

anonymous
()

По ссылке на указатель.

anonymous
()

Вопрос, как правильно передавать в процедуры упакованные элементы для их модификации?

Переделать функции, чтобы принимаемые ими аргументы тоже были packed.

SZT ★★★★★
()
Ответ на: комментарий от fsb4000

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

slapin ★★★★★
()
Ответ на: комментарий от slapin

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

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

slapin ★★★★★
()
Ответ на: комментарий от slapin

Или использовать черную магию.

Не такая уж она и черная. Просто гнутое расширение взять

#include <stdio.h>
#include <stdlib.h>

typedef int __attribute__ ((aligned (1))) int_unalign;

struct __attribute__((__packed__)) mystruct_A {
  char a;
  int b;
  char c;
};

int my_test_func1(int *a)
{
  return *a+1;
}


int my_test_func2(int_unalign *a)
{
  return *a+1;
}

int main(void)
{
  struct mystruct_A a = {1,2,3};
  printf("%d\n", my_test_func1(&a.b)); // тут варнинг

  printf("%d\n", my_test_func2(&a.b)); // тут нет

  return EXIT_SUCCESS;
}

SZT ★★★★★
()
Ответ на: комментарий от SZT

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

slapin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.