| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 971 人关注过本帖
标题:初学C语言,关于用C语言实现动态数组求解惑
只看楼主 加入收藏
CodeSuperHer
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-5-27
收藏
 问题点数:0 回复次数:9 
初学C语言,关于用C语言实现动态数组求解惑
程序代码:
        intArray iArray;
    intArray *pArray = &iArray;
    for (int32_t i = 0; i < time; i++)
    {
        intArray_add(pArray, i);
    }
        

这种使用结构体的方式测试时间为78ms,
        
程序代码:
        intArray* iArray = malloc(sizeof(intArray));
    for (int32_t i = 0; i < time; i++)
    {
        intArray_add(iArray, i);
    }
        

而这种使用方式测试时间为 93ms,为什么差距这么大?

另外还有这个add方法还可以优化不?,我和c#的List<T>.add 分别执行了一百万次,c#时间是23ms,但是我自己实现的时间为78ms
      
程序代码:
        void intArray_capacity(intArray *iArray) {
        if (iArray->length >= iArray->capacity) {
        iArray->capacity *= 2;
        iArray->data = (int32_t *)realloc(iArray->data, sizeof(int32_t)* iArray->capacity);
        }
        }

        void intArray_add(intArray *iArray, int32_t data) {
            intArray_capacity(iArray);
        iArray->data[iArray->length++] = data;
        }
    
搜索更多相关主题的帖子: C语言 结构体 动态 
2015-05-27 02:40
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
答复第一个问题  malloc的工作机制是申请一大块内存,若满足时可返回内存块指针。若不满足时,延时去寻找足够大的内存来分配。还不满足,那就返回空指针。

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2015-05-27 09:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
速度快慢取决于程序在执行时具体干了什么,不是由语言和源代码决定的。

授人以渔,不授人以鱼。
2015-05-29 13:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
void intArray_capacity(intArray *iArray) {
         if (iArray->length >= iArray->capacity) {
         iArray->capacity *= 2;
         iArray->data = (int32_t *)realloc(iArray->data, sizeof(int32_t)* iArray->capacity);
         }
         }

你的速度慢在这里被我描红的地方

授人以渔,不授人以鱼。
2015-05-29 14:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
乱用、滥用realloc(),这点我反复告诫过很多次,不重复。用一个函数之前,必须首先了解它的工作机制,不明白的就不要用,这可是忠告。realloc()可是标准库函数,看库函数手册就是了,没拥有这个、不看这个,写程序很悬呢,真以为学会点语法和算法就可以写程序了?

C#的比你快,因为它的工作机制跟你实现的不同,其实你也没看C#和C++中关于动态容器的介绍,就是会用C#写,但不知道它是怎么工作的,那不叫“会”。

[ 本帖最后由 TonyDeng 于 2015-5-29 14:10 编辑 ]

授人以渔,不授人以鱼。
2015-05-29 14:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看点资料吧:
图片附件: 游客没有浏览图片的权限,请 登录注册


授人以渔,不授人以鱼。
2015-05-29 14:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
注意realloc()函数返回值的意义:那是一个可能被移动了的指针,亦即新的数据可能不再在原来的位置。那是什么意思呢?就是说,数据可能是重新开辟空间存放的,而这必须把原来的数据复制到新的地方去。为什么慢?这就是原因!你申请的空间不断增长,原来的空间不足应用,所以在不断地重新申请、不断地复制数据,那快慢差别可不是简单的乘法了。

[ 本帖最后由 TonyDeng 于 2015-5-29 14:56 编辑 ]

授人以渔,不授人以鱼。
2015-05-29 14:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实这个道理是很容易理解的:不管是栈上的一块内存,还是堆上的一块内存,分配之后,都是无法再伸缩的(要缩小倒是很容易,不用多余的就可以了),不可能在后面接驳不足的部分,因为后面的连续空间可能已经被别的数据使用了,那个时候,就得把整块空间挪到新的位置,并且把原来的数据搬过来。这就是realloc()返回的指针为什么可能会变化的原因,假如程序员没有这个意识,使用指针的时候,以为realloc()所指向的空间是不变的,就会出现各种各样的内存问题,尤其是在你拥有多个指向同一空间的指针的情况下,它们极可能是不同步变化的。指针的困难在这种地方。

[ 本帖最后由 TonyDeng 于 2015-5-29 15:13 编辑 ]

授人以渔,不授人以鱼。
2015-05-29 15:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
很早版本的C++,就已经有智能指针,C++也推荐尽量使用智能指针,放弃C的指针,这与不提倡用原始数组的理念是一样的,现在新的C++11标准,也制定了更多更完善的智能指针模型,都比原始的C指针好用。C#的List,其实就是C++标准库中的vector,它的实现机制在很多资料上都有介绍,比如在《C++ Primer》中就有,那是跟你所设计的机制完全不同的。为什么C#的比你快,看一看那些资料就明白,解答也在那里。

授人以渔,不授人以鱼。
2015-05-29 15:12
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
??= <:stdio.h:>
??=define D NO
void main()
??<
    printf(D);
??>

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2015-05-29 18:01
快速回复:初学C语言,关于用C语言实现动态数组求解惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022183 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved