【发布时间】:2023-03-30 20:29:01
【问题描述】:
我有一个包含多个数组成员的结构:
typedef myData someStruct {
uint16_t array1 [ARRAY_LENGTH]
uint16_t array2 [ARRAY_LENGTH]
} myData;
myData testData = {0}; // Global struct
在我的程序中的某个时刻,我需要将数组设置为一组预定义的值,例如,将 array1 设置为全 0,将 array2 设置为全 0xFF,等等。我的第一直觉是写出一个 for 循环,例如:
void someFunction (myData * test) {
for (uint16_t i = 0; i < ARRAY_LENGTH; ++i) {
test->array1[i] = 0xFF;
test->array2[i] = 0xCC;
}
}
然后我推断程序执行此操作所需的操作类似于:
load address of array1 first position
set value 0xFF;
load far address of array2 first postion
set value 0xCC;
load far address of array1 second position
set value 0xFF;
// and so on...
然而,如果我为每个数组使用单独的循环,地址会彼此更接近(因为数组和结构是连续存储的),所以地址每次只加载到下一个字节,使代码实际上更高效如下:
void someFunction (myData * test) {
uint16_t i = 0;
for (i; i < ARRAY_LENGTH; ++i)
test->array1[i] = 0xFF;
for (i = 0; i < ARRAY_LENGTH; ++i)
test->array2[i] = 0xCC;
}
我的推理是否正确,第二个更好吗?此外,编译器(例如 gcc)通常能够自己进行这种优化吗?
【问题讨论】:
-
我假设数组在进程堆栈上
-
为什么不喜欢这样的memset memset(&mys.a,0xff,sizeof(mys.a)); memset(&mys.b,0xcc,sizeof(mys.b));
-
我的意思是:以下语句是否正确:“地址加载每次只到下一个字节,使代码实际上更高效如下”? [我实际上不知道答案...我假设从特定地址读取内存值应该花费相同的时间,而与地址值无关]
-
@kripanand memset 将设置每个字节。他需要设置单词。
-
@Toby,那你为什么不能从一开始就正确初始化它们呢?
标签: c arrays for-loop performance