|
|
|
Переменная по адресу не кратному 4 байт. |
|
|
|
Sep 14 2018, 09:15
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(Kabdim @ Sep 14 2018, 11:56) Не переживайте Я-то как раз и не переживаю, поскольку использую то, что дает компилятор, как это указано в мануале на компилятор. По мне - пусть проблемы размещения объектов решает тот, кто их обязан решать - компилятор с линкером. Для этого они и созданы. Иначе писал бы на ассемблере. Достаточно лишь разумно использовать встроенные штатные инструменты, вместо того, чтобы заниматься "самодеятельностью". Впрочем, тут каждый сам решает: бороться с "ветряной мельницей" или обойти ее стороной, не связываясь Цитата Ну и к чему эти намеки... Не стоить лукавать, вы все прекрасно поняли - ведь вон как активно оправдываетесь
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 14 2018, 09:59
|
Знающий
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842
|
Цитата(aaarrr @ Sep 14 2018, 12:04) Пруф. Нельзя вызывать memcpy абы как. Ну вообще там говорится что оптимизатор верят в то что программист знает язык, на котором программирует, не более того. Рекомендаций по неиспользованию memcpy там не дается. Цитата(Forger @ Sep 14 2018, 12:15) Не стоить лукавать, вы все прекрасно поняли - ведь вон как активно оправдываетесь Ох уж эти школьные подколки.
|
|
|
|
|
Sep 14 2018, 12:17
|
Гуру
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136
|
Цитата(aaarrr @ Sep 14 2018, 15:08) Пожалуйста, пример по ссылке в сообщении #15. Вот это что ли? Код #include <string.h>
unsigned int * const dest;
void example (unsigned int * const unaligned_ptr) { __packed unsigned int * packed_ptr = unaligned_ptr; char * temp_ptr = (char *)unaligned_ptr; memcpy(dest, unaligned_ptr, 32); /* Unsafe */ memcpy(dest, (void *)packed_ptr, 32); /* Safe */ memcpy(dest, temp_ptr, 32); /* Safe */ } Пожалуйста: Цитата A pointer to an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned for the pointed-to type, the behavior is undefined. То есть где-то привели указатель на что-то (да хотя бы на char) к типу указатель на unsigned int, выравнивание не было соблюдено - бац! неопределённое поведение. А как вы хотели?
|
|
|
|
|
Sep 14 2018, 13:00
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
del - Извиняюсь, кривой пример получилсяНет, все же правильный: Код unsigned int dst[4]; int main(void) { memcpy(dst, (void *)123, 8); } ; generated by ARM C/C++ Compiler, 4.1 [Build 462] ; commandline armcc [--debug -c --asm -omain.o --cpu=Cortex-A8 --fpu=VFPv3 --diag_style=ide --depend_format=unix_escaped --no_depend_system_headers ..\main.c] ARM REQUIRE8 PRESERVE8 AREA ||.text||, CODE, READONLY, ALIGN=2 main PROC MOV r1,#0x7b LDR r0,|L1.24| VLD1.64 {d0},[r1] VST1.64 {d0},[r0] MOV r0,#0 BX lr ENDP
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|