假设我有这样的POD类型:
struct A {
char a;
int b;
};
Run Code Online (Sandbox Code Playgroud)
在我的系统上,sizeof(A) == 8即使sizeof(char) == 1和sizeof(b) == 4.这意味着数据结构有3个未使用的字节.
现在假设我们这样做
A x = ...;
A y =x;
Run Code Online (Sandbox Code Playgroud)
题:
难道是保证所有8个字节的x和y将是相同的,即使是那些3分未使用的?
同样,如果我将某些A对象的底层字节转移到另一个不理解其含义或结构的程序,并将它们视为一个8字节的数组,那么其他程序可以安全地比较两个As的相等吗?
注意:在使用gcc 7的实验中,似乎会复制这些字节.我想知道这是否有保证.
我想出了一个定义一个通用比较运算符的想法,它可以用于任何类型,以获得它的乐趣.
#include <cstring>
#include <iostream>
class A
{
public:
A(int id) : id(id) {}
private:
int id;
};
template <class T>
inline bool operator==(const T& a, const T& b)
{
return memcmp(&a, &b, sizeof(a)) == 0; // implementation is unimportant (can fail because of padding)
}
int main()
{
std::cout << (A(10) == A(10)) << std::endl; // 1
std::cout << (A(10) == A(15)) << std::endl; // 0
}
Run Code Online (Sandbox Code Playgroud)
我认为这可以用来解决c ++中缺少默认比较运算符的问题.
这是一个糟糕的主意吗?我想知道在某些情况下这样做是否会破坏任何东西?