请问如何最快的初始化一个很大的二维数组?

littlebao 2005-10-11 02:08:30
比如int array[1000][1000] ;
想对每个值初始化为10
只能一个个初始化吗?memset只能对单个字节进行初始化。
如何实现最快呢?
...全文
282 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pomelowu 2005-10-11
  • 打赏
  • 举报
回复
那还不如这样:
void * __cdecl intset (
void *dst,
int val,
size_t count
)
{
void *start = dst;

while (count--) {
*(int *)dst = val;
dst = (int *)dst + 1;
}

return(start);
}

然后与memset类似的用就好了:
int array[1000][1000] ;
intset(array, 10, 1000 * 1000);
gunney 2005-10-11
  • 打赏
  • 举报
回复
void *memset(
void *dest,
int c,
size_t count
);
void ZeroMemory(
PVOID Destination,
SIZE_T Length
);
To avoid undesired effects of optimizing compilers, use the SecureZeroMemory function.

void FillMemory(
PVOID Destination,
SIZE_T Length,
BYTE Fill
);

Snow_Ice11111 2005-10-11
  • 打赏
  • 举报
回复
我试了多次,memset(array, 10, 1000 * 1000);这样的语句初始化成0或-1都没问题,初始化成其它值就会失败,看来只能用for循环了。
yangl79 2005-10-11
  • 打赏
  • 举报
回复
有个想法是这样的,用循环,但我没有时间写程序,还是较为复杂:
先给第一项赋值,array[0][0] = 10;
然后把第一项用memcpy拷贝到第二项;
再把第一、第二项拷贝到第三、四项;
再把第一、二、三、四项拷贝到第五、六、七、八项;
...
以次拷贝的项数为1,2,4,8,16,...
pomelowu 2005-10-11
  • 打赏
  • 举报
回复
还是只有用循环。Windows下的内存填充函数都是以byte为单位的。
littlebao 2005-10-11
  • 打赏
  • 举报
回复
不好意思,应该是:
memset(array, 0, 1000 * 1000*sizeof(int));
littlebao 2005-10-11
  • 打赏
  • 举报
回复
form msdn:

Parameters
dest
Pointer to destination
c
Character to set
count
Number of characters

很明显memset是按字节初始化的,而且最后一个参数也是字节数。
int array[1000][1000] ;
memset(array, 10, 1000 * 1000);
明显是不行的。
如果想初始化为0,还可以用下面的方法。
memset(array, 10, 1000 * 1000*sizeof(int));
但是现在我想初始化为一个非零值如何做呢?
pomelowu 2005-10-11
  • 打赏
  • 举报
回复
唔,memset是按BYTE置位的,而你申明的是int,会导致误差
yangl79 2005-10-11
  • 打赏
  • 举报
回复
int array[1000][1000];
int v = 10;
for (int i = 0; i < 1000 * 1000; i++)
memcpy(array + 4 * i, &v, 4);
pomelowu 2005-10-11
  • 打赏
  • 举报
回复
int array[1000][1000] ;
memset(array, 10, 1000 * 1000);
你看看每个的值是多少你就知道了。
_______________

建议你看看。 呵呵~
不过VC默认堆栈是1M,你试图分配接近1M的堆栈空间,小心Stack Overflow
yangl79 2005-10-11
  • 打赏
  • 举报
回复
int array[1000][1000]={0};
是全部初始化成0?我怎么映象中是初始化第一项为0,那int array[1000][1000]={0, 0};又怎么解释呢?
littlebao 2005-10-11
  • 打赏
  • 举报
回复
用memset怎么做啊?memset只能对单个字节赋值啊,int是四个字节的。
qubo 2005-10-11
  • 打赏
  • 举报
回复
memset即可
littlebao 2005-10-11
  • 打赏
  • 举报
回复
我不是指在定义时初始化,而是在定义之后初始化。
Snow_Ice11111 2005-10-11
  • 打赏
  • 举报
回复
抱歉,没看清楼主是要初始化成10。用楼上pomelowu(羽战士)的方法就行了。
littlebao 2005-10-11
  • 打赏
  • 举报
回复
int array[1000][1000] ;
memset(array, 10, 1000 * 1000);
你看看每个的值是多少你就知道了。
pomelowu 2005-10-11
  • 打赏
  • 举报
回复
>memset只能对单个字节进行初始化。

??什么意思啊
int array[1000][1000] ;
memset(array, 10, 1000 * 1000);
Snow_Ice11111 2005-10-11
  • 打赏
  • 举报
回复
int array[1000][1000]={0};
全部初始化成0

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧