bit_cast能做与memcpy相同的事情吗?在没有未定义行为的情况下,将指针存储到短路数组中



虽然可能有XY问题导致我走到这里,但我对C++20中新bit_cast的极限很好奇,这似乎是一个很好的例子。

请注意,std::memcpy本身没有任何问题,也不会导致未定义的行为。它也是一个习惯用法,通常可以优化为等效于演员阵容。我遇到的问题是,它的使用意图并没有尽可能清楚,而且它似乎更像是C而不是C++。

你怎么能使用bit_cast来做与以下相同的事情(没有任何未定义的行为(:

#include <cstring>
void ptr2array(short (&x)[], int offset, const void * ptr)
{
std::memcpy(&(x[offset]), ptr, sizeof(void *));
}
void array2ptr(void * & ptr, int offset, short (&x)[])
{
std::memcpy(ptr, &(x[offset]), sizeof(void *));
}

请注意,以下基本上是无操作(在此处测试:https://godbolt.org/z/ce9Ecx8TG)

void * tst(void * orig)
{
short x[101];
int offset = 67;
void * ret=orig;
ptr2array(x, offset, ret);
array2ptr(ret, offset, x);
return ret;
}

请记住,memcpy可以很好地处理未对准(使用偏移(。

与char相反,还需要一组short,避免了对char的一些宽容,但保留了对齐问题。

bit_cast用于在对象之间进行转换。它创建了一个新对象,其二进制数据来自其他对象。它不适用于语言数组,因为它们是对象,但与对象不同。你不能像传递其他对象那样传递它们。它们衰减为指针,不能返回数组等。

您可以将bit_caststd::array和类似类型结合使用,但即使是这些类型也可能存在问题。例如CCD_ 7不需要具有CCD_ 8的大小。并且bit_cast只有在源对象和目标对象具有相同大小的情况下才有效。

bit_cast还返回它创建的对象。这意味着您无法(轻松(将bit_cast放入现有存储中。从的一系列字节中执行bit_cast也不容易。

如果您正试图将数据位复制到存储中。。。就这么做吧。bit_cast并不是要取代memcpy的所有使用。

最新更新