小编yat*_*nai的帖子

我可以使用新的放置作为 bit_cast 吗?

我对绕过二进制类型转换限制的方法感兴趣,因为 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 == …

c++ placement-new c++20 bit-cast

0
推荐指数
1
解决办法
226
查看次数

将指针强制转换为指向数组的指针是否被视为 UB?

最近我想知道是否可以显式定义指针是什么并显式确定其类型。假设我们在返回 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)

c++

0
推荐指数
1
解决办法
215
查看次数

标签 统计

c++ ×2

bit-cast ×1

c++20 ×1

placement-new ×1