加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用按位或代替std :: max进行缓冲区大小调整

发布时间:2020-12-16 10:03:23 所属栏目:百科 来源:网络整理
导读:我正在看一些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); 我相信这
我正在看一些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个结构中最大的结构的确切大小.我以前从未见过上述成语,不得不停下来甚至说服自己它会起作用.

所以,既然我是新手,我一般都想知道这是多么有效,以及这样做的好处和缺点是什么.

我能看到的是 –

亲们:

>它应该总是给你一个至少与你最大的结构大小一样大的尺寸.如果空间不是很重要,那么这就是你真正需要的.
>它似乎可以在编译时计算.
>它应该适用于非常老的C(甚至C)编译器.

CON:

>它可能使尺寸几乎是必要的两倍.
>这使得人们更难以确定离线确切的缓冲区大小.
>奇怪/意外.

解决方法

它在MAX_COMMAND_BUFFER始终至少与这些结构的所有大小的最大值一样大的意义上是有效的.很容易验证这一点 – 按位| – 所有大小一起将为您提供一个值,该值具有与最大大小相同的位,加上可能还有其他大小.

然而,这是非常令人困惑的,你必须停下来思考它.另外,如果你有两个8和7的尺码,你最终会得到15,这可能不是你想要的.值得庆幸的是,std::max有一个constexpr重载,需要一个initializer_list< T>,所以只需使用:

static constexpr size_t MAX_COMMAND_BUFFER =
//               ^^^^^^
        std::max({sizeof(struct S1),sizeof(struct S2),...,sizeof(struct S6)});

如果您的编译器不支持该重载,那么编写一个可变参数函数模板来完成相同的操作非常简单.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读