相关疑难解决方法(0)

是否复制了POD类型的填充字节?

假设我有这样的POD类型:

struct A {
    char a;
    int b;
};
Run Code Online (Sandbox Code Playgroud)

在我的系统上,sizeof(A) == 8即使sizeof(char) == 1sizeof(b) == 4.这意味着数据结构有3个未使用的字节.

现在假设我们这样做

A x = ...;
A y =x;
Run Code Online (Sandbox Code Playgroud)

题:

难道是保证所有8个字节的xy将是相同的,即使是那些3分未使用的?

同样,如果我将某些A对象的底层字节转移到另一个不理解其含义或结构的程序,并将它们视为一个8字节的数组,那么其他程序可以安全地比较两个As的相等吗?

注意:在使用gcc 7的实验中,似乎会复制这些字节.我想知道这是否有保证.

c++ copy-constructor

47
推荐指数
3
解决办法
2181
查看次数

定义通用比较运算符

我想出了一个定义一个通用比较运算符的想法,它可以用于任何类型,以获得它的乐趣.

#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 ++中缺少默认比较运算符的问题.

这是一个糟糕的主意吗?我想知道在某些情况下这样做是否会破坏任何东西?

c++ generics

23
推荐指数
3
解决办法
2334
查看次数

标签 统计

c++ ×2

copy-constructor ×1

generics ×1