好的,在我发布这个问题之前,我确信在这个社区中有这些所谓的“专业人士”,指责我过早优化。让我说清楚:我想确定我正在写的是什么,即使它在函数内的堆栈级别是如此细微差别。 我有一个多维数组,我知道为了访问数据,你需要访问这些索引变量,然后访问数组本身,占用了大量的时间。所以我这样做了:
char* ref = gdata.mapnames[game.maptype][game.map];
size_t a = strlen(ref) - 4;
ref[a] = '\0';
strcpy(temppath, ref);
ref[a] = '.';`
我将多维数组包装在一个用作指针的简单局部变量中。由于我必须多次访问同一个数组,这种方法是否可以节省查找时间,从而节省运行时速度?理论上当然,由于现在处理器速度如此之快,你不会看到任何差异,除非我写更大的应用需要这个。多维数组不是坏习惯吗?
答案 0 :(得分:1)
首先,不要使用strcpy
,这很危险,请改用strncpy。关于你的问题,编译器会为你做所有这些事情,不用担心查找任何东西。
答案 1 :(得分:0)
在C ++中,由于运算符重载,mapnames [i]实际上可能是函数调用。换句话说,可以执行相当复杂的代码。在C中,这只是指针算术。 编译器是否优化这取决于很多因素,包括平台,版本和变量限定符。唯一可以确定的方法是检查装配输出。 在这种情况下,在我看来,使用临时变量更具可读性。
答案 2 :(得分:0)
使用中途优秀的优化器,这将使速度完全没有差异并且可能产生完全相同的机器代码(除非您处理线程代码和多个线程可见的数组),但使用临时变量使代码更容易编写和更容易阅读。但是,我会将其余的大部分代码块重写为:
ssize_t a = strlen(ref) - 4;
if( a < 0 ) a = 0;
if( a >= sizeof( temppath ) ) a = sizeof(temppath)-1; /* assumes temppath is an array */
strncpy( temppath, ref, a );
temppath[a] = 0;
解释:如果(ref)的长度小于4个字节,则size_t将作为一个非常大的数字结束,因为size_t是无符号的。 ssize_t已签名,因此它将为负值。接下来,做边界检查。我使用带有null终止符的strncpy,因为如果你不需要,通常最好避免修改字符串输入。
编辑实际上,除非优化器知道数组内容在函数过程中是不可变的,否则gdata.mapnames [game.maptype] [game.map]实际上是一个char []数组,它不能缓存ref,但它可能能够缓存&amp; gdata.mapnames [game.maptype] [game.map]。