我对绕过二进制类型转换限制的方法感兴趣,因为 bit_cast 使用复制到堆栈上的变量,这不是很快。但据我所知,普通类型不会在默认构造函数中初始化内存。这是否意味着,对于将 bit_casting 转换为普通类型,我们可以使用放置 new 和指向我们感兴趣的内存的指针,从而保持内存中的字节不变并避免不必要的复制?在这个问题上是否有我找不到的标准立场,并且禁止我将新的位置与一些“非主题”指针一起使用?
例如,第一个选项是其他人如何使用此功能。第二个选项是我想如何使用它。
#include <iostream>
using namespace std;
class Foo
{
private: int __unused0 : 31; //A little bit of binary magic
private: int __unused1 : 1;
public: Foo() : __unused0(1), __unused1(1) {} //We're still saving trivially_copyable, so we're good
};
int main()
{
//char bytes[1024];
//auto* foo = new(bytes) Foo;
Foo bytes{};
auto* foo = new(&bytes) int;
cout << *foo;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
UPD:这一切的目的是在不更改容器的情况下处理内存中的原始字节。在最简单的情况下,我需要像“检查寄存器中的高位”这样的小型优化,这是通过单个汇编命令来实现的,例如[x < 0]在处理结构中的位字段时创建一系列命令,例如[x & 0x80][x >> 7][x == …
最近我想知道是否可以显式定义指针是什么并显式确定其类型。假设我们在返回 us 的new operator表达式中使用了 the 。但我想保护自己免受可能的错误的影响,并希望明确指示指针中元素的大小。auto* x = new int[4];int*
我发现你可以定义一个指向形式数组的指针T(*name)[size]。这种指针转换算UB吗?我们似乎通过添加信息来保留基本指针类型,这是否违反了类型别名的规则?
int main()
{
auto* p = new int[10];
decltype(auto) n = (int(*)[10])(p);
*n[1]=1;
}
Run Code Online (Sandbox Code Playgroud)