是否在此实现中承诺缓存失效

use*_*550 1 c gcc caching volatile

请考虑以下代码:

volatile uint32_t word;
for (i=0; i<10; i++)
{
    word = *(uint32_t *)(ADDRESS_IN_MEMORY);
    printf("%"PRIu32, word);
    some_function_compiled_in_other_object();  /* this function may or may not change memory content at adress ADDRESS_IN_MEMORY */
}
Run Code Online (Sandbox Code Playgroud)

所以,既然word是不稳定的,我们知道word = *(uint32_t *)(ADDRESS_IN_MEMORY)确实会执行10次.但是,这里有关于系统缓存的承诺吗?我希望ADDRESS_IN_MEMORY在每次从这个地址读取之后,编译后的代码将在\之前无效,因此word将从系统内存而不是缓存中加载值.承诺了吗?

答案取决于编译器是否知道some_function_compiled_in_other_object更改内存地址的值ADDRESS_IN_MEMORY

Bre*_*dan 5

因此,由于word是volatile,我们知道word =*(uint32_t*)(ADDRESS_IN_MEMORY)确实会被执行10次.

没有.

假设CPU有一些寄存器(并且只允许值传输到寄存器或从寄存器传输,并且不允许数据直接从存储器中的一个位置传输到存储器中的另一个位置),并且编译的代码实际上做了更像这样的事情:

    for (i=0; i<10; i++)
    {
        CPU_register_1 = *(uint32_t *)(ADDRESS_IN_MEMORY);
        word = CPU_register_1
Run Code Online (Sandbox Code Playgroud)

现在让我们假设编译器优化了代码.它知道它*(uint32_t *)(ADDRESS_IN_MEMORY);不是易失性的,所以它可能会把它转换成这样的东西;

    CPU_register_1 = *(uint32_t *)(ADDRESS_IN_MEMORY);
    for (i=0; i<10; i++)
    {
        word = CPU_register_1
Run Code Online (Sandbox Code Playgroud)