小编Bwe*_*ebb的帖子

性能:Mod 和赋值与条件和赋值

我在 ISR 中有一个计数器(由 50us 的外部 IRQ 触发)。计数器递增并环绕 MAX_VAL (240)。

我有以下代码:

if(condition){
  counter++;
  counter %= MAX_VAL;
  doStuff(table[counter]);
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑另一种实现:

if(condition){
  //counter++;//probably I would increment before the comparison in production code
  if(++counter >= MAX_VAL){
    counter=0;
  }
  doStuff(table[counter]);
}
Run Code Online (Sandbox Code Playgroud)

我知道人们建议不要尝试这样优化,但这让我想知道。在 x86 上什么更快?MAX_VAL 的什么值可以证明第二个实现是合理的?

大约每 50us 调用一次,因此减少指令集并不是一个坏主意。if(++counter >= MAX_VAL) 将被预测为 false,因此在绝大多数情况下它将删除对 0 的赋值。出于我的目的,我更喜欢 %= 实现的一致性。

c x86 assembly micro-optimization

3
推荐指数
1
解决办法
355
查看次数

如何在C中将数组的一个维度设置为零

假设我有一个全局声明的3d数组(在数据段中),我想将其1d memset为0.

int multi_dimension_array[x][y][z];
Run Code Online (Sandbox Code Playgroud)

我可以用线条记住整个事情:

memset(multi_dimension_array, 0, sizeof(multi_dimension_array));
Run Code Online (Sandbox Code Playgroud)

但是现在假设我只想将x维度设置为某个值(比如2),这意味着multi_dimension_array [2] [0] [0]到multi_dimension_array [2] [y-1] [z-1]的值应该全部为零.我不认为这是一个聪明的方法来使用memset y或z,因为它们不是连续的.以下行应该有效:

memset(&multi_dimension_array[2][0][0], 0, sizeof(multi_dimension_array[2][0][0]) * y * z);
Run Code Online (Sandbox Code Playgroud)

我的"问题"是我不喜欢memset param的*y*z部分.数组中是否存在sizeof(multi_dimension_array [2])== byte_size_of_type*y*z?

我想使用sizeof将在此示例中评估为"x"维度的正确字节数的数组属性.我不想在有人改变声明中的大小并且他们不改变这个memset的情况下使用*y*z,而且我不喜欢它看起来如何.

c memset

2
推荐指数
1
解决办法
236
查看次数

标签 统计

c ×2

assembly ×1

memset ×1

micro-optimization ×1

x86 ×1