Jump to content

    

Переменная по адресу не кратному 4 байт.

Не переживайте

Я-то как раз и не переживаю, поскольку использую то, что дает компилятор, как это указано в мануале на компилятор.

По мне - пусть проблемы размещения объектов решает тот, кто их обязан решать - компилятор с линкером. Для этого они и созданы. Иначе писал бы на ассемблере.

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

Впрочем, тут каждый сам решает: бороться с "ветряной мельницей" или обойти ее стороной, не связываясь ;)

 

Ну и к чему эти намеки...
Не стоить лукавать, вы все прекрасно поняли - ведь вон как активно оправдываетесь :)

Share this post


Link to post
Share on other sites
Пруф. Нельзя вызывать memcpy абы как.

Ну вообще там говорится что оптимизатор верят в то что программист знает язык, на котором программирует, не более того. Рекомендаций по неиспользованию memcpy там не дается.

Не стоить лукавать, вы все прекрасно поняли - ведь вон как активно оправдываетесь :)

Ох уж эти школьные подколки.

Share this post


Link to post
Share on other sites
Ох уж эти школьные подколки.
Все верно: для каждого случая - "подколка" соответствующего "уровня сложности" ;)

Share this post


Link to post
Share on other sites
Ну вообще там говорится что оптимизатор верят в то что программист знает язык, на котором программирует, не более того.

Где же это там такое говорится?

Share this post


Link to post
Share on other sites
Где же это там такое говорится?

Расписывание про натруальное выравнивание и использование его в оптимизации оно и есть кмк.

Share this post


Link to post
Share on other sites
Расписывание про натруальное выравнивание и использование его в оптимизации оно и есть кмк.

В данном случае это как раз отклонение от стандарта - у библиотечной memcpy нет ограничений по выравниванию.

Share this post


Link to post
Share on other sites
В данном случае это как раз отклонение от стандарта - у библиотечной memcpy нет ограничений по выравниванию.

Нет тут никакого отклонения от стандарта. Считается что в невыровненной памяти не может быть объекта, а значит компилятор имеет право рассчитывать что указатель указывает на выровненную память и соответственно оптимизировать. Для того что бы memcpy принимал невыравненный буфер, достаточно самому не стрелять себе в ногу , т.е. не делать ненужные преобразования из типа элемента буфера в тип требующий более строгого выравнивания.

Share this post


Link to post
Share on other sites
Нет тут никакого отклонения от стандарта. Считается что в невыровненной памяти не может быть объекта...

Каким типом данных по стандарту оперирует memcpy?

Share this post


Link to post
Share on other sites
Каким типом данных по стандарту оперирует memcpy?

В данном случае это не имеет значения. В вашей программе появился указатель на (условно)int - он уже считается выровненным, а если он не выравнен, то ваша программа уже ill-formed и всё что происходит после этого факта уже не важно.

Share this post


Link to post
Share on other sites
В данном случае это не имеет значения.

Имеет. memcpy() принимает на вход указатель типа void и оперирует типом char. Очевидно, что ограничений на выравнивание тут нет.

И происхождение указателя на поведение функции влиять не должно.

Share this post


Link to post
Share on other sites
Каким типом данных по стандарту оперирует memcpy?

Так неинтересно. Для начала приведите пример, в котором вот эта лихая оптимизация memcpy приводит к сбою, а я приведу цитату из стандарта, которая пояснит, почему в примере содержится косяк.

Share this post


Link to post
Share on other sites
Так неинтересно. Для начала приведите пример, в котором вот эта лихая оптимизация memcpy приводит к сбою, а я приведу цитату из стандарта, которая пояснит, почему в примере содержится косяк.

Пожалуйста, пример по ссылке в сообщении #15.

Share this post


Link to post
Share on other sites
Пожалуйста, пример по ссылке в сообщении #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, выравнивание не было соблюдено - бац! неопределённое поведение. А как вы хотели?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Всё тоже самое нарушено, но на А8 оно по идее работает? И на х86 не выравненные обращения работают. Программы с ЮБ иногда работают так как задумал создатель, в этом и есть смысл ЮБ - никаких гарантий, даже гарантий неработоспособности. Конкретно тут наверняка страдает производительность.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now