查看 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/