打印

深入浅出: C 与 C++ 中“结构直接复制”的探讨

[复制链接]
楼主: highgear
手机看帖
扫描二维码
随时随地手机跟帖
21
呵呵.vc要用release版本的代码.debug版本没有优化.
其他编译软件使用速度优化.看结果.....

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
22
huangqi412| | 2011-5-11 21:35 | 只看该作者
:)

使用特权

评论回复
23
刘前辈| | 2011-5-11 21:39 | 只看该作者
本帖最后由 刘前辈 于 2011-5-11 21:41 编辑

谁说keil C 不能优化?你自己不会优化,不等于所有人都不会优化!
让你见识见识。
哈哈。所长有本事也把memcpy( )从282字节优化到42字节试试?天下第一怎么总做千年老二,跟着我后面长见识。——气蒙了?

使用特权

评论回复
24
刘前辈| | 2011-5-11 22:02 | 只看该作者
本帖最后由 刘前辈 于 2011-5-12 10:43 编辑
令牌环与结构拷贝有什么关系?刘工你机顶盒塞不进去, 与此帖有什么关系?


呵呵,那请问我C51结构拷贝和X86 有什么关系?和16位、32位处理器有什么关系?和C++有什么关系?和带DMA的芯片有什么关系?

还有,刚出院的 highgear 不知道所长一直贬低 keil  C , 好好看看15楼说的是什么?这是我和所长之间的事。


送你一张图,除了keil C51,你用什么C都无法给这个环形网上的节点编程。这种环境下:Keil C51是最强的。一览众山小。



还有你们家养的家犬——也叫highgear的,怎么昨天一出院就到处咬人,要和我PK点LED?什么毛病。我把这几张图送给highgear,(无论是人还是犬),是为了告诉昨天要咬我的highgear ,我不会玩LED和555,我只会玩令牌环。

哈哈,我怎么知道哪个highgear 是玩结构拷贝的所长,哪个highgear 是所长养的家犬? 怎么人狗都叫一个名字? 这不能怪我呀。冤枉!
      我的令牌环图是送给所长家养的 highgear 宠物的,不是给highgear 所长本人的。所长千万不要多心生气当回事了。
       还忘了一点,如果你看不出几张图对你帮123jj 把小车立起来有帮助的话,那只能怪你自己水平太差了。——我好心帮你忙呢。

       楼下的highgear 说自己不是所长,那就更对了。我昨天就告诉你要送你几张图帮你忙的。那应该没什么大惊小怪的。看来还是所长, 因为所长不知道这件事,所以很愤怒。

       对不起,特此说明 !


、、、、

使用特权

评论回复
25
highgear|  楼主 | 2011-5-11 22:06 | 只看该作者
Keil C 对 a1 = a2 没有任何优化,刘工你的23楼的帖子已经说明了这一点。

再给你说一次,我不是所长。

使用特权

评论回复
26
highgear|  楼主 | 2011-5-11 22:11 | 只看该作者
回答刘工 9 楼的问题:
复制一个10,000字节的结构或者文件!
    自己写for还是while ?不用,a1=a2; 一分钟不要,很简单就完成了


不错,a1 = a2 看上去是比 memcpy(&a1, &a2, 10000) 更简单,但是别忘了 struct 需要声明,先不必提动态文件缓冲区,来看看不同的文件复制:
memcpy(&p1, &p2, 10001);
memcpy(&p3, &p4, 10002);

刘工你打算声明多少个结构?

使用特权

评论回复
27
aihe| | 2011-5-11 22:19 | 只看该作者
自己不会,就去百度
1、星形网络拓扑结构: 以一台中心处理机(通信设备)为主而构成的网络,其它入网机器仅与该中心处理机之间有直接的物理链路,中心处理机采用分时或轮询的方法为入网机器服务,所有的数据必须经过中心处理机。 星形网的特点: (1)网络结构简单,便于管理(集中式); (2)每台入网机均需物理线路与处理机互连,线路利用率低; (3)处理机负载重(需处理所有的服务),因为任何两台入网机之间交换信息,都必须通过中心处理机; (4)入网主机故障不影响整个网络的正常工作,中心处理机的故障将导致网络的瘫痪。 适用场合:局域网、广域网。
2、总线形网络拓扑结构: 所有入网设备共用一条物理传输线路,所有的数据发往同一条线路,并能够由附接在线路上的所有设备感知。入网设备通过专用的分接头接入线路。总线网拓扑是局域网的一种组成形式。 总线网的特点: (1)多台机器共用一条传输信道,信道利用率较高; (2)同一时刻只能由两台计算机通信; (3)某个结点的故障不影响网络的工作; (4)网络的延伸距离有限,结点数有限。 适用场合:局域网,对实时性要求不高的环境。
3、环形网络拓扑结构: 入网设备通过转发器接入网络,每个转发器仅与两个相邻的转发器有直接的物理线路。环形网的数据传输具有单向性,一个转发器发出的数据只能被另一个转发器接收并转发。所有的转发器及其物理线路构成了一个环状的网络系统。 环形网特点: (1)实时性较好(信息在网中传输的最大时间固定); (2)每个结点只与相邻两个结点有物理链路; (3)传输控制机制比较简单; (4)某个结点的故障将导致物理瘫痪; (5)单个环网的结点数有限。 适用场合:局域网,实时性要求较高的环境。
4、网状网络拓扑结构: 利用专门负责数据通信和传输的结点机构成的网状网络,入网设备直接接入结点机进行通信。网状网络通常利用冗余的设备和线路来提高网络的可靠性,因此,结点机可以根据当前的网络信息流量有选择地将数据发往不同的线路。 适用场合: 主要用于地域范围大、入网主机多(机型多)的环境,常用于构造广域网络。

http://zhidao.baidu.com/question/80089729.html


使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
刘前辈 + 1
28
来与君| | 2011-5-11 22:30 | 只看该作者
这两人前世骨头混一块了,唉:hug:

使用特权

评论回复
29
Txapp| | 2011-5-11 22:53 | 只看该作者
这是咋回事呢?

使用特权

评论回复
30
刘前辈| | 2011-5-12 09:28 | 只看该作者
本帖最后由 刘前辈 于 2011-5-12 10:02 编辑

谁说keil C51结构拷贝不能优化?!LZ自己不会优化,就以为所有的人都不会比自己更高明?真以为自己天下第一呢。

     呵呵,让小辈我来教教你,LZ 睁大眼睛看清楚,俺是怎么实现优化的。把LZ的memcpy( )从282字节优化到了22字节。




    一下子显得LZ这种探讨没了一点意义,纯粹是自己无知,什么“一字节复制使用了大量代码,效率极其低下。”还玩到了C++来解决keil C51效率低下的问题?
    本想贬低他人,结果还是让keil 羞辱了一把。你当keil 这个老外德国人像你这么蠢?

1#
      可以看到,仅仅一个字节的复制,竟然使用了大量的代码,效率及其低下.
这就是说,Keil C 中”结构直接复制” 简单的调用了 memcpy。

        真像那么回事似地。我KEIL C调用了所长的memcpy( ) ? 谁调用谁呀,装腔作势似地。 你的memcpy( ) 能像结构复制这样优化? 你玩一个给俺瞧瞧,开开眼。别光顾着指责别人这不行,那不对;很简单的道理,你玩一个对的、漂亮的给我们菜鸟看看,做个模板让我们学习。别光凭嘴巴说,玩文化产业,忽悠我们菜鸟不懂 ?

     唬得了一时骗不了长久 。骗到54 岁了还大忽悠呢。
   13楼早就告诉你,结构拷贝可以寄存器优化,而memcpy()无法实现(用户实参指针,你能优化?好好动动脑子)。竟然没听懂别人说的是什么。

      呵呵,所长“天下第一高手”这几天又要在家研究memcpy 的优化问题了。一定要和别人比较个高下?
        累不累?


、、

、、

使用特权

评论回复
31
来与君| | 2011-5-12 11:07 | 只看该作者
别,这个是地址复制吧。

使用特权

评论回复
32
aihe| | 2011-5-12 13:08 | 只看该作者
小朋友真会开玩笑,拿魔术这一套来糊弄人



说白了就是自己写个类似头文件的东东拿来骗人的

使用特权

评论回复
33
aihe| | 2011-5-12 13:25 | 只看该作者
我承认我比较菜,我把Keil能更改的设置全改一遍,仍然得不到刘xx图示的结果,说人家PS的吧,无凭无据不能乱说。仔细看图片代码才发现问题的症结所在
我们编译器自带的C?COPY是插在Main函数之前的,而且不会有LOOP1这种指定地址的方式的,他的C?COPY函数为什么会在Main函数之后,
再看那个项目怎么比我们自己做实验多了个文件夹,结果就是那样简单,就像把刘谦的魔术放慢了仔细看,就知道他是怎么变出花样来了。
这种把戏拿来娱乐一下大家,炫耀一下自己是不错的
但拿来PK那就有点胜之不武了,不过对小孩子嘛,用不着上火动气,自会有家长管教的

使用特权

评论回复
34
icecut| | 2011-5-12 13:31 | 只看该作者
本帖最后由 icecut 于 2011-5-12 13:33 编辑

代码开销:和复制1字节一样。282字节。当然时间可能不一样,C51拷贝什么都是逐字节来的。反正C51上感觉不到,和复制1字节一样快
-------------------------------
使用时钟周期/字节.你就知道是不是一样快了.
就是在c51上,优化还是有可能的.
-----------------------------------------------
不信你做一个32k字节的复制试试.
最快速的代码是最长的代码,最小的代码是最慢的代码
在高性能计算理论里,这叫做循环展开
------------------------------------------------
只会用for和while,却不会选移动操作的人,还是一边休息吧.
DMA快,但是是硬件层,这里不谈

使用特权

评论回复
35
刘前辈| | 2011-5-12 14:58 | 只看该作者
本帖最后由 刘前辈 于 2011-5-12 15:18 编辑

34楼aihe,我来教你怎么优化。你得不到结果,不一定是别人唬你。如若谁都能做到,LZ就不会在这做这种探讨了。
    首先282字节完全是由于?C?COPY这个通用的完整的库函数代码太长的缘故。它是通用的,无论是data——>XDATA,还是idata,xdata之间,都可以互相拷贝,没什么不好。编译器首先设好a1,a2,2个指针,和复制长度;然后调用?C?COPY函数。我想你当然知道,所长所说的“效率低下的大量代码”是干什么用的:

1、a2 指针,在R1(指针低8),R2(指针高8),R3(存贮区编码);
2、a1 指针,在R0,R4,R5;(对应上述 L,H, 编码);
3、复制长度:int 在R6,R7。

         效率低下?为了调用 ?C?COPY,8个寄存器一个也不能优化掉。因为?C?COPY是库函数。它要求输入3个实参。
        所以,要缩写代码,只能重写库函数?C?COPY。
既然我是固定存贮区idata之间复制10字节,我只要把idata 之间互相复制的代码加以利用就行了。其他的编译器都做了。
          我重写了?C?COPY ,谁不知道项目库函数连接顺序可以自己设定?——把自己写的?C?COPY函数放在当前项目文件目录里就行了。
             还用我把我写的?C?COPY 函数源代码给你看吗?

           冤枉了别人,是不是应该有所表示?

          很多时候,不是我们比别人高明,只是我们想不到或者没想到而已;别人一个套想了半年,我们可能想一辈子也想不到;所以,互相学习才好。
      后面的结构复制 优化到22字节,更难想到了。所长弄出个什么一字节的结构复制!然后由此下结论:Keil  C 不行,没他的C++好。下这种套?还C++ 解决?结果把自己绕进去了。

、、、、

使用特权

评论回复
36
aihe| | 2011-5-12 15:22 | 只看该作者
本帖最后由 aihe 于 2011-5-12 15:25 编辑

我没冤枉你吧,是你重写了?C?COPY函数,不是德国佬怎么高明,其他编译器也可以这样做的,也不是你特别能耐,也不能证明Keil在这点上比其他编译器优越啊,
O(∩_∩)O哈哈~

使用特权

评论回复
37
xiaoaihua| | 2011-5-12 15:42 | 只看该作者
做硬件的不知道你们所云,呵呵淡定的飘过~

使用特权

评论回复
38
刘前辈| | 2011-5-12 15:48 | 只看该作者
本帖最后由 刘前辈 于 2011-5-12 16:08 编辑

呵呵,aihe如若会重写库函数,早就想到了。那么也就不会有34楼的魔术疑问了。

还有,像那种“多了一个文件夹test”的问题,我看别人下面都是好几个文件夹,——那些都是文本文件或者是其它项目文件,可以随时换项目或者添加C文件的。


至于Keil C51 系统自带的?C?COPY 和memcpy( )比较的问题,所长已经一开始就证明了,2者代码完全一致,2者效率完全一样,都同样低下。自己把自己的memcpy( )否定了。面对事实,不得不。



aihe 还真有点特殊,你把memcpy( )实验也用同一个编译器做一下看,结果完全一样。8个寄存器设置,然后调用?C?COPY库函数。

如若懒得做,(怎么证明别人错的时候那么大精神,各种设置值都实验了一遍。)轮到证实自己错误的时候就懒得做了?咱们都是上海人,老乡,不会互相开打吧。
      我帮你做一遍?

、、

使用特权

评论回复
39
aihe| | 2011-5-12 16:00 | 只看该作者
我呢是比较菜,但是我相信Keil自带的函数肯定是有他的道理,他们也不是白痴
开始我写函数的时候,看别人的函数都是太复杂了,偷偷得精简
不过到后来,考虑移植和通用,慢慢的写的和人家的就差不多了
说错话,做错事不要紧,别人指正时只要虚心接受,有则改之无则加勉就可以了
我才没事找人开打,不过那儿人都一样,只要保持住自己的心境,淡定淡定,O(∩_∩)O哈哈~

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
40
刘前辈| | 2011-5-12 16:04 | 只看该作者
这下可以看清第二个文件夹 test 里的内容了。上面的内容主要是自己的隐私文件名,不愿公开而已。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则