Перейти к содержанию
    

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

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

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пруф. Нельзя вызывать memcpy абы как.

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет тут никакого отклонения от стандарта. Считается что в невыровненной памяти не может быть объекта...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В данном случае это не имеет значения.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...