小编unt*_*led的帖子

在 x86 上发送 IPI 后内存写入是否可见?

我读过《Intel 64 and IA-32 Architectures SDM vol 3A, 9.2 MEMORY ORDERING》,但有一个问题一直困扰着我。

如果我首先写入内存地址,然后使用 x2APIC 发送处理器间中断(IPI),这意味着发送 IPI 不需要写入内存(只需使用 wrmsr)。另一个核心接收IPI并读取内存,它会读取正确的值吗?

例如:

最初 x = 0

处理器0:

mov [ _x], 1
wrmsr       # use x2APIC to send IPI
Run Code Online (Sandbox Code Playgroud)

处理器1:

# resive IPI, in the interrupt service routine:
mov r1, [ _x]
Run Code Online (Sandbox Code Playgroud)

r1 = 0 允许吗?

x86 assembly operating-system memory-barriers msr

6
推荐指数
1
解决办法
117
查看次数

临时变量是否在语句结束时释放?

我试图找出临时变量何时被释放。我写了下面的代码。

#include <stdio.h>

class C
{
public:
    C()
    {
        printf("C O\n");
    }
    C(const C&)
    {
        printf("C& O\n");
    }
    virtual ~C()
    {
        printf("C D\n");
    }
};

int kkk(const C&)
{
    printf("kkk\n");
    return 0;
}
int kkk2(int)
{
    printf("kkk2\n");
    return 0;
}

int main()
{
    (kkk2( kkk2( (kkk(C()),3) ) ), printf("dsfsdfs\n"), true) && (printf("dsdddf\n"),true);
    printf("=====\n");
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

我期望C类在被调用后被释放kkk,但实际上,结果是:

C O
kkk
kkk2
kkk2
dsfsdfs
dsdddf
C D
=====
Run Code Online (Sandbox Code Playgroud)

我用 g++ clang++ 和 msvc++ 运行代码,结果是一样的。C 类在声明结束时释放。

在语句末尾释放临时变量是 C++ 标准吗?

c++

0
推荐指数
1
解决办法
172
查看次数

标签 统计

assembly ×1

c++ ×1

memory-barriers ×1

msr ×1

operating-system ×1

x86 ×1