我读过《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 允许吗?
我试图找出临时变量何时被释放。我写了下面的代码。
#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++ 标准吗?