Пример переупорядочения памяти - PullRequest
2 голосов
/ 06 января 2020

Я пытаюсь найти пример переупорядочения памяти, чтобы я мог продемонстрировать использование барьера ( asm volatile («»::: «memory»))

Я скопировал код из одного из вопросов о стековом потоке и скомпилировал его с флагом g cc -O3. Работа __asm__ __volatile__ (""::: "memory")

#include <stdio.h>

int c(int *d, int *e) {
        int r;
        d[0] += 1;
        r = e[0];
        d[1] += 1;
        return r;
}


int main()
{
    int arr[2] = {0x00, 0x01};
    int e[2] = {0x1, 0x2};
    c(arr, e);
    printf("arr[0]:%d\t arr[1]:%d\n", arr[0], arr[1]);
    printf("e[0]:%d\t e[1]:%d\n", e[0], e[1]);
    return 0;
}

$ objdump -D

00000000000006c0 <c>:
 6c0:   83 07 01                addl   $0x1,(%rdi)
 6c3:   8b 06                   mov    (%rsi),%eax
 6c5:   83 47 04 01             addl   $0x1,0x4(%rdi)
 6c9:   c3                      retq   
 6ca:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)

Это согласно порядку здесь. Есть ли код, который на самом деле демонстрирует переупорядочение операций с памятью.

...