首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问如果给数组快速赋一个最大值

2013-12-28 
请教如果给数组快速赋一个最大值?请教如果给数组快速赋一个最大值?int arr[100]我知道 memset(arr, 0, 100

请教如果给数组快速赋一个最大值?
请教如果给数组快速赋一个最大值?
int arr[100]
我知道 memset(arr, 0, 100 * sizeof(int)); 是将数组快速清零;

怎么让数组每个值都为 INT_MAX?
多谢。
[解决办法]

int * pI = arr;
int * pE = arr + sizeof(arr)/sizeof(arr[0]);
while( pI != pE )
*( pI++ ) = INT_MAX;

[解决办法]
引用:
int * pI = arr;
int * pE = arr + sizeof(arr)/sizeof(arr[0]);
while( pI != pE )
*( pI++ ) = INT_MAX;


说实话, 这种优化价值不大, 现代编译器的优化完全可以取代这种手工优化.
LZ不要在这种问题上花太多时间.
[解决办法]
memset的本身效率也是不高的!
如果在循环体中,也是不建议使用的!
[解决办法]
循环赋值呗,你觉得怎么才叫快速
[解决办法]
楼主没有必要苛求效率到赋值一块
[解决办法]
引用:
memset的本身效率也是不高的!
如果在循环体中,也是不建议使用的!


有其它更高效的做法吗? 不使用循环.

楼主还是老实的使用循环吧, 即使是memset内部, 也是用的循环来做的.

[解决办法]
如果对性能确实有较高要求,内存都是对齐的,可以用MMX,SSE2指令,肯定比编译器编出来的代码快很多
[解决办法]
引用:
Quote: 引用:

int arr[100] = INT_MAX;//c++ style

目测楼主需要的是编译优化,在编译期确定初始值


兄弟,这个语句应该是给第100个赋值,前99个还没赋吧?

你应该说“兄弟,这个语句应该是给第100 + 1个赋值,前99 + 1个还没赋吧?”
C++的数组初始化就是这样写的,我记得C语言还不支持数组初始化
[解决办法]
引用:
Quote: 引用:

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;


您的这样写优化到哪里?求教了,多谢。
各位:纯粹写代码为了玩,不考虑编译器优化或者实用性。
他这个就是为了当你调整数组大小,不用改这一块代码,只需要改声明的地方。
通常在基础函数中这样,也算是比较好的习惯。当然,得看是什么项目需求了,如果是追求高效率的,不一定这样
[解决办法]
引用:
如果对性能确实有较高要求,内存都是对齐的,可以用MMX,SSE2指令,肯定比编译器编出来的代码快很多

+1
其他方法貌似都不能起到性能的要求
[解决办法]
#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
//


[解决办法]
引用:
如果对性能确实有较高要求,内存都是对齐的,可以用MMX,SSE2指令,肯定比编译器编出来的代码快很多

这也仅仅是针对特定CPU的优化, 使用特定的编译器就可以支持这种优化, 比如ICC

热点排行