小编k h*_*ang的帖子

如果不使用堆,移动语义有用吗?

我对移动语义的直觉是对象字段的浅层复制,然后可能是对旧 r 值的一些破坏。然而,据我所知,当某些字段拥有指针/引用时,只有浅拷贝/深拷贝存在差异。如果您根本不使用堆,所以没有mallocor new,那么您可能不会有拥有指针的类/结构。因此,移动构造函数与常规复制构造函数没有任何区别。我的逻辑正确吗?

c++ move heap-memory move-semantics

3
推荐指数
1
解决办法
126
查看次数

可能存在严格的别名违规吗?

我滚动浏览了一些帖子,并读到了有关严格别名规则的内容。它看起来非常接近我在俱乐部项目中看到的一些代码,相关片段如下。

LibSerial::DataBuffer dataBuffer;
size_t BUFFER_SIZE = sizeof(WrappedPacket);

while(true) {
    serial_port.Read(dataBuffer, sizeof(WrappedPacket));
    uint8_t *rawDataBuffer = dataBuffer.data();

    //this part
    auto *wrappedPacket = (WrappedPacket *) rawDataBuffer;
...
Run Code Online (Sandbox Code Playgroud)

结构体定义是:

typedef struct __attribute__((__packed__)) TeensyData {
    int16_t adc0, adc1, adc2, adc3, adc4, adc5, adc6, adc7, adc8, adc9, adc10, adc11;
    int32_t loadCell0;
    double tc0, tc1, tc2, tc3, tc4, tc5, tc6, tc7;
} TeensyData;

typedef struct __attribute__((__packed__)) WrappedPacket {
    TeensyData dataPacket;
    uint16_t packetCRC;
} WrappedPacket;
Run Code Online (Sandbox Code Playgroud)

希望很明显我是 C++ 新手。那么1)这是否违反了规则?2)如果是,有哪些替代解决方案?

c++ strict-aliasing undefined-behavior c++20

2
推荐指数
1
解决办法
310
查看次数

有时不需要“latomic”标志?

我知道GCC 链接库-latomic需要该标志。atomic但是,由于某种原因std::atomic<int>不需要它来构建

不使用 latomic 构建

而结构体则

构建需要原子

这种差异是由什么造成的呢?

c++ gcc atomic stdatomic

-1
推荐指数
1
解决办法
142
查看次数