c++ - 使用单个 memset 清零多个数组/假设允许内存布局?

标签 c++ arduino avr arduino-c++

查看 Arduino-Ethernet-Library 的源代码我找到了 this :

class DhcpClass {
private:
...
    #ifdef __arm__
        uint8_t  _dhcpLocalIp[4] __attribute__((aligned(4)));
        uint8_t  _dhcpSubnetMask[4] __attribute__((aligned(4)));
        uint8_t  _dhcpGatewayIp[4] __attribute__((aligned(4)));
        uint8_t  _dhcpDhcpServerIp[4] __attribute__((aligned(4)));
        uint8_t  _dhcpDnsServerIp[4] __attribute__((aligned(4)));
    #else
        uint8_t  _dhcpLocalIp[4];
        uint8_t  _dhcpSubnetMask[4];
        uint8_t  _dhcpGatewayIp[4];
        uint8_t  _dhcpDhcpServerIp[4];
        uint8_t  _dhcpDnsServerIp[4];
    #endif
...

以及this :

void DhcpClass::reset_DHCP_lease()
{
    // zero out _dhcpSubnetMask, _dhcpGatewayIp, _dhcpLocalIp, _dhcpDhcpServerIp, _dhcpDnsServerIp
    memset(_dhcpLocalIp, 0, 20);
}

这真的是访问/归零那些数组(类的字段)的合法方法吗?我们真的可以安全地假设它们总是按照这个顺序并且总是在一个连续的内存位置吗?我相信没有,但我不明白为什么有人不为每个数组编写一个 memset(),性能真的好得多吗?

最佳答案

虽然在arduino环境下,性能提升并不显着, 您可能正在努力减少生成代码的每个字节(不仅仅是执行速度)。

如所列,代码是个坏主意,虽然它“可能”工作正常,但通常还不够好。

对于这种情况,您可以这样做:

class DhcpClass {
private:
    struct {
    #ifdef __arm__
        uint8_t  LocalIp[4] __attribute__((aligned(4)));
        uint8_t  SubnetMask[4] __attribute__((aligned(4)));
        uint8_t  GatewayIp[4] __attribute__((aligned(4)));
        uint8_t  DhcpServerIp[4] __attribute__((aligned(4)));
        uint8_t  DnsServerIp[4] __attribute__((aligned(4)));
    #else
        uint8_t  LocalIp[4];
        uint8_t  SubnetMask[4];
        uint8_t  GatewayIp[4];
        uint8_t  DhcpServerIp[4];
        uint8_t  DnsServerIp[4];
    #endif
    } _dhcp;
    void reset_DHCP_lease()
    {
        memset(&_dhcp, 0, sizeof(_dhcp));
    }
};

尽管您必须更改其余代码以匹配。

编辑添加:

如果类不包含虚方法和其他数据,您也可以这样做:

memset(this, 0, sizeof(*this));

关于c++ - 使用单个 memset 清零多个数组/假设允许内存布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69559589/

相关文章:

c++ - 土耳其字母表的凯撒密码解密

javascript - 带有 javascript/cylonjs 的云盾

node.js - 树莓派(node.js)与Arduino uno串口通信

arduino - 用 Arduino 驱动两个超声波传感器

c++ - arduino,c++的简单位图旋转

c++ - 使用自定义用户输入处理在屏幕上播放透明视频

c++ - 如何 shell 到另一个应用程序并让它以 Borland VCL 形式出现 (c++)

c++ - 为什么这个 C++ 'new' 运算符的实现有效?

c++ - 基类引用 - 为其分配其他类型

c - 我可以将 printf 与 PSTR 一起使用吗?