user-0 提问: 请教如果给数组快速赋一个最大值？

回复:
user: user-1
content: 引用 12 楼 damo_xu 的回复:[quote=引用 1 楼 baichi4141 的回复:] int * pI = arr; int * pE = arr + sizeof(arr)/sizeof(arr[0]); while( pI != pE ) *( pI++ ) = INT_MAX;  这代码貌似就是一个循环，给内存赋值，我若这样写似乎没什么区别：  for (int i=0; i<100; ++i) *( arr+i ) = INT_MAX;  您的这样写优化到哪里？求教了，多谢。 各位：纯粹写代码为了玩，不考虑编译器优化或者实用性。[/quote]他这个就是为了当你调整数组大小，不用改这一块代码，只需要改声明的地方。 通常在基础函数中这样，也算是比较好的习惯。当然，得看是什么项目需求了，如果是追求高效率的，不一定这样

user: user-0
content: 引用 11 楼 rogone 的回复:[quote=引用 10 楼 damo_xu 的回复:] [quote=引用 8 楼 rogone 的回复:] int arr[100] = INT_MAX;//c++ style 目测楼主需要的是编译优化，在编译期确定初始值  兄弟，这个语句应该是给第100个赋值，前99个还没赋吧？[/quote] 你应该说“兄弟，这个语句应该是给第100 + 1个赋值，前99 + 1个还没赋吧？” C++的数组初始化就是这样写的，我记得C语言还不支持数组初始化[/quote]  哦，你原来是这个意思。 第一个问题，我错了。呵呵，哥们连数组最后一位应该减一也忘了！看来，是该拾起来的时候了。 第二个问题，你的这个C++给数组赋值应该没有这个语法。现在的编译器，应该都是给数组默认赋值的。而且我刚刚在VC9里debug测试了，你这个语句对数组内存没有作用。

user: user-0
content: 引用 1 楼 baichi4141 的回复:int * pI = arr; int * pE = arr + sizeof(arr)/sizeof(arr[0]); while( pI != pE ) *( pI++ ) = INT_MAX;  这代码貌似就是一个循环，给内存赋值，我若这样写似乎没什么区别：  for (int i=0; i<100; ++i) *( arr+i ) = INT_MAX;  您的这样写优化到哪里？求教了，多谢。 各位：纯粹写代码为了玩，不考虑编译器优化或者实用性。

user: user-2
content: 引用 10 楼 damo_xu 的回复:[quote=引用 8 楼 rogone 的回复:] int arr[100] = INT_MAX;//c++ style 目测楼主需要的是编译优化，在编译期确定初始值  兄弟，这个语句应该是给第100个赋值，前99个还没赋吧？[/quote] 你应该说“兄弟，这个语句应该是给第100 + 1个赋值，前99 + 1个还没赋吧？” C++的数组初始化就是这样写的，我记得C语言还不支持数组初始化

user: user-0
content: 引用 8 楼 rogone 的回复:int arr[100] = INT_MAX;//c++ style 目测楼主需要的是编译优化，在编译期确定初始值  兄弟，这个语句应该是给第100个赋值，前99个还没赋吧？

user: user-0
content: 多谢众位的回复。哥们快2年没编程了（原来可是我的唯一，哈哈）。现在年前得空，想把排序再玩一遍。只是觉得赋值应该有个既快又简洁的函数，类似memset的。  既然各位大拿都说了，还是用循环吧。如果实际的项目，确实要考虑编译器优化。  多谢了。

user: user-2
content: int arr[100] = INT_MAX;//c++ style 目测楼主需要的是编译优化，在编译期确定初始值

user: user-3
content: 如果对性能确实有较高要求，内存都是对齐的，可以用MMX,SSE2指令，肯定比编译器编出来的代码快很多

user: user-4
content: 引用 3 楼 max_min_ 的回复:memset的本身效率也是不高的！ 如果在循环体中，也是不建议使用的！  有其它更高效的做法吗? 不使用循环.  楼主还是老实的使用循环吧, 即使是memset内部, 也是用的循环来做的.

user: user-5
content: 楼主没有必要苛求效率到赋值一块

user: user-6
content: 循环赋值呗，你觉得怎么才叫快速

user: user-0
content: 引用 17 楼 zhao4zhong1 的回复:#include <stdio.h> int arr[100]; int main() {     int i;     __asm {         push ecx         push edi         mov eax,0x7FFFFFFF         mov ecx,100         mov edi,offset arr[0]         rep stosd         pop edi         pop ecx     }     for (i=0;i<100;i++) printf("%03d,%d\n",i,arr[i]);     return 0; }   汇编？呵呵，这个就不懂了。

user: user-7
content: memset的本身效率也是不高的！ 如果在循环体中，也是不建议使用的！

user: user-8
content: 引用 1 楼 baichi4141 的回复:int * pI = arr; int * pE = arr + sizeof(arr)/sizeof(arr[0]); while( pI != pE ) *( pI++ ) = INT_MAX;  说实话, 这种优化价值不大, 现代编译器的优化完全可以取代这种手工优化. LZ不要在这种问题上花太多时间.

user: user-9
content: int * pI = arr; int * pE = arr + sizeof(arr)/sizeof(arr[0]); while( pI != pE ) *( pI++ ) = INT_MAX;

user: user-10
content: 这种根本就不算优化。

user: user-8
content: 引用 7 楼 zhuobattle 的回复:如果对性能确实有较高要求，内存都是对齐的，可以用MMX,SSE2指令，肯定比编译器编出来的代码快很多 这也仅仅是针对特定CPU的优化, 使用特定的编译器就可以支持这种优化, 比如ICC

user: user-11
content: #include <stdio.h> int arr[100]; int main() {     int i;     __asm {         push ecx         push edi         mov eax,0x7FFFFFFF         mov ecx,100         mov edi,offset arr[0]         rep stosd         pop edi         pop ecx     }     for (i=0;i<100;i++) printf("%03d,%d\n",i,arr[i]);     return 0; } //000,2147483647 //001,2147483647 //002,2147483647 //003,2147483647 //004,2147483647 //005,2147483647 //006,2147483647 //007,2147483647 //008,2147483647 //009,2147483647 //010,2147483647 //011,2147483647 //012,2147483647 //013,2147483647 //014,2147483647 //015,2147483647 //016,2147483647 //017,2147483647 //018,2147483647 //019,2147483647 //020,2147483647 //021,2147483647 //022,2147483647 //023,2147483647 //024,2147483647 //025,2147483647 //026,2147483647 //027,2147483647 //028,2147483647 //029,2147483647 //030,2147483647 //031,2147483647 //032,2147483647 //033,2147483647 //034,2147483647 //035,2147483647 //036,2147483647 //037,2147483647 //038,2147483647 //039,2147483647 //040,2147483647 //041,2147483647 //042,2147483647 //043,2147483647 //044,2147483647 //045,2147483647 //046,2147483647 //047,2147483647 //048,2147483647 //049,2147483647 //050,2147483647 //051,2147483647 //052,2147483647 //053,2147483647 //054,2147483647 //055,2147483647 //056,2147483647 //057,2147483647 //058,2147483647 //059,2147483647 //060,2147483647 //061,2147483647 //062,2147483647 //063,2147483647 //064,2147483647 //065,2147483647 //066,2147483647 //067,2147483647 //068,2147483647 //069,2147483647 //070,2147483647 //071,2147483647 //072,2147483647 //073,2147483647 //074,2147483647 //075,2147483647 //076,2147483647 //077,2147483647 //078,2147483647 //079,2147483647 //080,2147483647 //081,2147483647 //082,2147483647 //083,2147483647 //084,2147483647 //085,2147483647 //086,2147483647 //087,2147483647 //088,2147483647 //089,2147483647 //090,2147483647 //091,2147483647 //092,2147483647 //093,2147483647 //094,2147483647 //095,2147483647 //096,2147483647 //097,2147483647 //098,2147483647 //099,2147483647 //

user: user-0
content: 引用 14 楼 xinhua0910 的回复:他这个就是为了当你调整数组大小，不用改这一块代码，只需要改声明的地方。 通常在基础函数中这样，也算是比较好的习惯。当然，得看是什么项目需求了，如果是追求高效率的，不一定这样  哦，多谢了。我通常把数组100 define 成 N，到时候改N值。 他这种写法的确不错。

user: user-12
content: 引用 7 楼 zhuobattle 的回复:如果对性能确实有较高要求，内存都是对齐的，可以用MMX,SSE2指令，肯定比编译器编出来的代码快很多 +1 其他方法貌似都不能起到性能的要求