Forger 26 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Не переживайте Я-то как раз и не переживаю, поскольку использую то, что дает компилятор, как это указано в мануале на компилятор. По мне - пусть проблемы размещения объектов решает тот, кто их обязан решать - компилятор с линкером. Для этого они и созданы. Иначе писал бы на ассемблере. Достаточно лишь разумно использовать встроенные штатные инструменты, вместо того, чтобы заниматься "самодеятельностью". Впрочем, тут каждый сам решает: бороться с "ветряной мельницей" или обойти ее стороной, не связываясь ;) Ну и к чему эти намеки...Не стоить лукавать, вы все прекрасно поняли - ведь вон как активно оправдываетесь :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Пруф. Нельзя вызывать memcpy абы как. Ну вообще там говорится что оптимизатор верят в то что программист знает язык, на котором программирует, не более того. Рекомендаций по неиспользованию memcpy там не дается. Не стоить лукавать, вы все прекрасно поняли - ведь вон как активно оправдываетесь :) Ох уж эти школьные подколки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Ох уж эти школьные подколки.Все верно: для каждого случая - "подколка" соответствующего "уровня сложности" ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Ну вообще там говорится что оптимизатор верят в то что программист знает язык, на котором программирует, не более того. Где же это там такое говорится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Где же это там такое говорится? Расписывание про натруальное выравнивание и использование его в оптимизации оно и есть кмк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Расписывание про натруальное выравнивание и использование его в оптимизации оно и есть кмк. В данном случае это как раз отклонение от стандарта - у библиотечной memcpy нет ограничений по выравниванию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба В данном случае это как раз отклонение от стандарта - у библиотечной memcpy нет ограничений по выравниванию. Нет тут никакого отклонения от стандарта. Считается что в невыровненной памяти не может быть объекта, а значит компилятор имеет право рассчитывать что указатель указывает на выровненную память и соответственно оптимизировать. Для того что бы memcpy принимал невыравненный буфер, достаточно самому не стрелять себе в ногу , т.е. не делать ненужные преобразования из типа элемента буфера в тип требующий более строгого выравнивания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Нет тут никакого отклонения от стандарта. Считается что в невыровненной памяти не может быть объекта... Каким типом данных по стандарту оперирует memcpy? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Каким типом данных по стандарту оперирует memcpy? В данном случае это не имеет значения. В вашей программе появился указатель на (условно)int - он уже считается выровненным, а если он не выравнен, то ваша программа уже ill-formed и всё что происходит после этого факта уже не важно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба В данном случае это не имеет значения. Имеет. memcpy() принимает на вход указатель типа void и оперирует типом char. Очевидно, что ограничений на выравнивание тут нет. И происхождение указателя на поведение функции влиять не должно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Каким типом данных по стандарту оперирует memcpy? Так неинтересно. Для начала приведите пример, в котором вот эта лихая оптимизация memcpy приводит к сбою, а я приведу цитату из стандарта, которая пояснит, почему в примере содержится косяк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Так неинтересно. Для начала приведите пример, в котором вот эта лихая оптимизация memcpy приводит к сбою, а я приведу цитату из стандарта, которая пояснит, почему в примере содержится косяк. Пожалуйста, пример по ссылке в сообщении #15. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Пожалуйста, пример по ссылке в сообщении #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, выравнивание не было соблюдено - бац! неопределённое поведение. А как вы хотели? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Всё тоже самое нарушено, но на А8 оно по идее работает? И на х86 не выравненные обращения работают. Программы с ЮБ иногда работают так как задумал создатель, в этом и есть смысл ЮБ - никаких гарантий, даже гарантий неработоспособности. Конкретно тут наверняка страдает производительность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться