查看Arduino-Ethernet-Library的源代码,我发现如下:
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
...
以及这个:
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));