c++ - 使用按位或代替 std::max 来调整缓冲区大小

标签 c++ struct bit-manipulation sizeof bitwise-or

我正在查看一些 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)编译器一起使用。

缺点:

  • 它可能使大小几乎是所需大小的两倍。
  • 这使得人们更难离线准确地计算出缓冲区的大小。
  • 这很奇怪/出乎意料。

最佳答案

它在 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)});

如果您的编译器不支持该重载,那么编写可变参数函数模板来完成同样的事情非常简单。

关于c++ - 使用按位或代替 std::max 来调整缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38062950/

相关文章:

c - OpenCL 结构参数无效的地址空间

ios - 如何让我的形象隐藏在我的标签后面?

c++ - 如何或或异或和内存块

mysql - 如何在 MySQL 语句中使用二进制/位域文字

c++ - 是否有可能在 Linux 中的 C/C++ 中获得指定日期/时间到达时的通知?

c++ - 如何从 const 方法生成非常量方法?

c++ - 发送 void 类型定义的函数指针作为要调用的参数

c++ - VBScript 和 C++ 之间 wuapi 的无法解释的差异

c - C 中用于内存管理器的各种长度结构?

Perl 按位 AND 给我奇怪的结果