Используя GCC, вы можете сделать что-то вроде этого.Можно ли предположить, что фиксированный размер memcpy оптимизирован?
void foo(MyStruct *a, const MyStruct *b)
{
memcpy(&a[0], b, sizeof(*a));
memcpy(&a[1], b, sizeof(*a));
memcpy(&a[2], b, sizeof(*a));
}
При написании переносимого кода, используя современные компиляторы C *, это может оптимизировать для вывода такой же, как asm
...
void foo(MyStruct a[3], const MyStruct *b)
{
a[0] = *b;
a[1] = *b;
a[2] = *b;
}
Мой вопрос, есть ли смысл предполагать вызов функции на memcpy
будет всегда быть оптимизирован?
Я прошу об этом, потому что я рассматривал возможность использования memcpy
в макросе, который получает экземпляр много раз с размером, известным во время компиляции. Если это вызовет memcpy
на некоторых платформах, я бы предпочел не называть его вообще. например: Implement generic swap macro in C
* современные компиляторы C (GCC/Clang/MSVC/ICC). со стандартным/безопасным уровнем оптимизации.
. А почему бы вам просто не написать 'a [0] = * b;' и т. Д. В функции/макросе –
В приведенном примере обязательно, но этот макрос подкачки использует, например, memcpy, http://stackoverflow.com/a/3982430/432509 - зная, что это то, чего следует избегать или нет, полезно. – ideasman42
Вы все равно можете присвоить значение массива, если оно завершено внутри структуры. (может помочь, может не так) – Leushenko