c – 使用按位或代替std :: max进行缓冲区大小调整
我正在看一些C网络代码.当我去找出缓冲区的大小时,我发现了这样的东西:
static const uint32_t MAX_COMMAND_BUFFER = sizeof(struct S1) | sizeof(struct S2) | sizeof(struct S3) | sizeof(struct S4) | sizeof(struct S5) | sizeof(struct S6); 我相信这里的基本思想是缓冲区可以包含这6个结构中的任何一个.这是在外部作用域声明的,因此它可用于稍后的外部作用域uint8_t数组大小. 现在通常在这里,我希望看到一些东西使用std :: max()函数或叔运算符来计算这6个结构中最大的结构的确切大小.我以前从未见过上述成语,不得不停下来甚至说服自己它会起作用. 所以,既然我是新手,我一般都想知道这是多么有效,以及这样做的好处和缺点是什么. 我能看到的是 – 亲们: >它应该总是给你一个至少与你最大的结构大小一样大的尺寸.如果空间不是很重要,那么这就是你真正需要的. CON: >它可能使尺寸几乎是必要的两倍. 解决方法
它在MAX_COMMAND_BUFFER始终至少与这些结构的所有大小的最大值一样大的意义上是有效的.很容易验证这一点 – 按位| – 所有大小一起将为您提供一个值,该值具有与最大大小相同的位,加上可能还有其他大小.
然而,这是非常令人困惑的,你必须停下来思考它.另外,如果你有两个8和7的尺码,你最终会得到15,这可能不是你想要的.值得庆幸的是, static constexpr size_t MAX_COMMAND_BUFFER = // ^^^^^^ std::max({sizeof(struct S1),sizeof(struct S2),...,sizeof(struct S6)}); 如果您的编译器不支持该重载,那么编写一个可变参数函数模板来完成相同的操作非常简单. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |