You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用constexpr函数在编译时为数组计算指定校验和?

带自动计算校验和的常量数组实现方案是否为良好实践?

需求背景

我有如下数组:

std::array<char, 10> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

需要为其追加2字节校验和,校验和的计算逻辑如下:

char x = 0;
char y = 0;

for (int i = 0; i < size; i++)
{
    x = x + array[i];
    y = x + y;
}

最终要把计算得到的x、y值放到数组末尾。同时我希望这个数组作为类成员方法内的static变量,结构如下:

class Foo
{
 public:
  char * getData(void)
  {
    static std::array<char, 10> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    // 需要在这里计算校验和
    return &numbers[0];
  }
}

现有实现思路

方案1:预留空间并使用constexpr函数

我考虑预留2字节空间,通过引用传入constexpr函数来计算校验和,示例函数如下(注:原代码中array[i]应为arr[i],已修正):

constexpr void checksum_calc(std::array<char, 12>& arr)
{
  char x = 0;
  char y = 0;
  
  for (int i = 0; i < 12 - 2; i++)
  {
      x = x + arr[i];
      y = x + y;
  }
  arr[10] = x;
  arr[11] = y;
}

方案2:模板化函数适配不同数组大小

为了适配不同长度的数组,我尝试将函数模板化,示例如下(注:原代码中array[i]应为arr[i],已修正):

template <size_t sz>
constexpr void checksum_calc(std::array<char, sz>& arr)
{
  char x = 0;
  char y = 0;
  
  for (int i = 0; i < sz - 2; i++)
  {
      x = x + arr[i];
      y = x + y;
  }
  arr[sz - 2] = x;
  arr[sz - 1] = y;
}

使用示例:

char * getData()
{
  // 预留2字节用于存储校验和
  static std::array<char, 12> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  checksum_calc<12>(numbers);
  return &numbers[0];
}

模板化后可以适配不同大小的数组,比如:

char * foo_getData()
{
  // 预留2字节校验和空间
  static std::array<char, 7> numbers = {1, 2, 3, 4, 5};
  checksum_calc<7>(numbers);
  return &numbers[0];
}

char * bar_getData()
{
  // 预留2字节校验和空间
  static std::array<char, 9> numbers = {1, 2, 3, 4, 5, 6, 7};
  checksum_calc<9>(numbers);
  return &numbers[0];
}

核心疑问

我的核心需求是得到自动计算2字节校验和的常量数组,完全不想手动计算并添加校验值,请问上面的实现方案是否属于良好实践?

内容的提问来源于stack exchange,提问作者MrBit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:40:48