【发布时间】:2020-10-07 14:16:36
【问题描述】:
我见过一个非常有经验的程序员做这样的事情:
#include <iostream>
#include <string>
using namespace std;
typedef int BOOL;
BOOL is_max(int a) {
return a&3;
}
class Foo
{
public:
inline Foo() {}
inline ~Foo() {}
int min[3];
int max[3];
};
int main()
{
Foo foo = Foo();
for (int i=0; i<3; i++) {
foo.min[i] = i;
foo.max[i] = i+3;
}
BOOL b = is_max(75); // b==3
// Print out foo.max[1] (which is foo.min[4])
cout << foo.min[1+b] << endl;
}
这是代码中计算量非常大的部分。所以我想它确实比使用 if 条件创建分支要快。由于两个数组(max 和 min)都是 int 类型并且在类定义中是连续的,因此这应该始终有效。
是否有理由避免这种方法?我知道这对于代码的可读性和可维护性可能不是最好的(例如,如果有人会在错误的位置添加第三个成员在类定义中,即在min 和max 之间)。可能会有更好的方法
int[6] extrema;
除此之外,这种方法还有其他缺点吗?这会以某种方式导致过早终止/分段错误吗?
【问题讨论】:
-
编译器可以在成员之间添加任意填充。
-
除此之外,我认为使用
BOOL作为整数类型看起来很混乱,应该避免。 -
你不应该这样做,因为它在技术上是越界访问和未定义的行为。
-
int extrema[6]; int* min = &extrema[0]; int* max = &extrema[3];? -
@David 这是一种有时在没有布尔类型的旧 C 中看到的方法。当未定义的行为可能不被视为大事时,也可能已经编写了较旧的代码库。可能是因为优化范围更窄?
标签: c++ arrays pointers data-structures