我一直在寻找在Linux中获取CPUID的代码,并且遇到了几个很好的例子。这些是实施差异之间的具体问题。下面是无符号整数,它使用reinterpret_cast,size_t为12
struct CPUVendorID{
unsigned int ebx;
unsigned int edx;
unsigned int ecx;
string toString() const {
return string(reinterpret_cast<const char *>(this), 12);
}
};
...
CPUVendorID vendorID { .ebx = ebx, .edx = edx, .ecx = ecx };
string vendor = vendorID.toString();
下面给出了另一种获得size_t为4的相同输出的形式:
string vendor;
vendor += string((const char *)&cpuID.EBX(), 4);
vendor += string((const char *)&cpuID.EDX(), 4);
vendor += string((const char *)&cpuID.ECX(), 4);
cout << "CPU vendor = " << vendor << endl;
两个输出12个字符串。有人能解释一下上面的reinterpret_cast语句中发生了什么吗?我发现这种实现方式非常优雅,但我不知道为什么它的工作显然是4 * 3 = 12。但是,它如何设法连接3 ebx,edx和ecx的数据?
CPU的制造商ID字符串 - 存储在EBX,EDX,ECX中的十二个字符的ASCII字符串(按此顺序)CPUID wiki
答案 0 :(得分:0)
有人能解释一下上面的reinterpret_cast语句中发生了什么吗?
结构地址this
与其第一个成员的地址一致,即int ebx
。由于以下成员属于同一类型,因此它们之间没有填充,因此此代码将三个int
成员视为int[3]
数组。