使用和不使用reinterpret_cast转换为字符串

时间:2016-05-24 13:32:46

标签: c++ c++11

我一直在寻找在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

1 个答案:

答案 0 :(得分:0)

  

有人能解释一下上面的reinterpret_cast语句中发生了什么吗?

结构地址this与其第一个成员的地址一致,即int ebx。由于以下成员属于同一类型,因此它们之间没有填充,因此此代码将三个int成员视为int[3]数组。