LINUX.ORG.RU

как помогает выравнивание в си для языка ассемблера?

 ,


0

3

Вот пример

int length __attribute__ ((aligned(32)));
Я вотт думаю что так будет легче обратиться к переменной типа [ + + * ], но ведь в ассемблере может быть и адрес без вычислений, ведь такие вычисления я знаю точно применяются чтобы получить argv[] строки.

Ты не только программировать, ты даже внятно изъясняться на русском не можешь...

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Неужели человек с вашим складом ума не может меня понять?

u0atgKIRznY5
() автор топика
int main ()
{
        char af[100] __attribute__ ((aligned(32)));

        af[1] = 32;
}

Вот дизассемблер

   0x00000000004004a6 <+0>:	lea    0x8(%rsp),%r10
   0x00000000004004ab <+5>:	and    $0xffffffffffffffe0,%rsp
   0x00000000004004af <+9>:	pushq  -0x8(%r10)
   0x00000000004004b3 <+13>:	push   %rbp
   0x00000000004004b4 <+14>:	mov    %rsp,%rbp
=> 0x00000000004004b7 <+17>:	push   %r10
   0x00000000004004b9 <+19>:	sub    $0x10,%rsp
   0x00000000004004bd <+23>:	movb   $0x20,-0x8f(%rbp)
   0x00000000004004c4 <+30>:	mov    $0x0,%eax
   0x00000000004004c9 <+35>:	add    $0x10,%rsp
   0x00000000004004cd <+39>:	pop    %r10
   0x00000000004004cf <+41>:	pop    %rbp
   0x00000000004004d0 <+42>:	lea    -0x8(%r10),%rsp
   0x00000000004004d4 <+46>:	retq 

Вот другой пример.

int main ()
{
        char af[100];

        af[1] = 32;
}
А вот дизассемблер
   0x00000000004004a6 <+0>:	push   %rbp
   0x00000000004004a7 <+1>:	mov    %rsp,%rbp
=> 0x00000000004004aa <+4>:	movb   $0x20,-0x6f(%rbp)
   0x00000000004004ae <+8>:	mov    $0x0,%eax
   0x00000000004004b3 <+13>:	pop    %rbp
   0x00000000004004b4 <+14>:	retq 

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

i-rinat а выравнивание на 4 действительно никакого эффекта не даёт.

u0atgKIRznY5
() автор топика

как помогает выравнивание в си для языка ассемблера?

Никак.

i-rinat ★★★★★
()

Я дам тебе ⅔ ответа на исходный вопрос, намеренно опустив некоторые случаи вроде передачи данных по сети. Ключевая фраза «машинное слово». Перестань уже читать умные книжки, тебе это лишь вредит

XMs ★★★★★
()
Ответ на: комментарий от XMs

Ключевая фраза «машинное слово».

Это для простых книжек. А вот для инструкций mmx, sse, sse2 - там другое «машинное слово»

vodz ★★★★★
()
Ответ на: комментарий от i-rinat

Ждём новую версию просмотрщика RFC, с оптимизацией на SSE2.

Зря иронизируете, уже никто не гарантирует, что компилятор вас не спросит и вставит. Главное, чтобы ТС ему не мешал, а то он может, да.

vodz ★★★★★
()

учи русский язык. Если сложности в формулировке своих мыслей - читай книги.

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

На самом деле делают кодом построенным на заморочках автора и никогда не оптимизируют, если это не какая-нибудь байда вроде видеокодека которая без этого будет кодировать неделю.

anonymous
()
Ответ на: комментарий от vodz

уже никто не гарантирует, что компилятор вас не спросит и вставит

Что значит не гарантирует? GCC на x86-64 для вычислений с плавающей точкой использует SSE/SSE2. Чтобы не использовал, его нужно отдельно попросить. Можно считать, что уже гарантируется, что SSE2 будет использоваться.

i-rinat ★★★★★
()

Чувак, напиши морду к sane на Gtk3

anonymous
()
Ответ на: комментарий от vodz

Для просмоторщика в си коде вычислений с плавающей точкой не нужно.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от no-such-file

Ну там по указателю на адрес видно, что адреса похожие, но только когда я выравнивание запрашиваю это отображается явно, это не значит что такое не происходит во втором примере. Или не так?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Тебя спросили «Зачем ты это делаешь» а не «как оно работает». Чего ты хочешь добиться в конце, повысить производительность? Думаю что этим флагом только хуже сделаешь.

pftBest ★★★★
()

Пожалуйста, начни с азов, а потом уже добирайся до выравниваний всяких и так далее. Почитай, как память работает, взаимодействие процессора и памяти, что такое кеш и с чем его едят. Найди себе скиллового собеседника и учись у него. После этого и не будешь писать везде выравнивание...

zamazan4ik ★★
()

Не уверен что правильно понял вопрос, но никак не помогает. Данный атрибут помогает компилятору оптимизировать код. Зачем его применять к int'у вообще ума не приложу. Почитать про выравнивание можно здесь

alexanius ★★
()

Доступ к выровненным данным осуществляется быстрее.
Почему так - особенности архитектуры. При обращении по невыровненным адресам может потребоваться больше шинных циклов, чем для выровненных адресов. Хотя это может уже не так для современных процессоров.
Но хуже всего, если твой int попадет на 2 разные страницы памяти,тогда обращение к нему чревато двумя pagefault'ами. Поэтому если уж выравнивать - то по-взрослому, на 4Кб.

bigbit ★★★★★
()
Последнее исправление: bigbit (всего исправлений: 1)
Ответ на: комментарий от bigbit

При обращении по невыровненным адресам может потребоваться больше шинных циклов

А на каком-нибудь arm или powerpc можно поймать bus error.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.