我在 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 的赋值。出于我的目的,我更喜欢 %= 实现的一致性。
假设我有一个全局声明的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,而且我不喜欢它看起来如何.