社区
C语言 帖子详情 C中为什么指针效率高 zhanglingxiang 2012-04-07 10:44:06 都说程序中用指针效率较高,为什么啊
...全文
2500 45 打赏 收藏 C中为什么指针效率高 都说程序中用指针效率较高,为什么啊 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 45 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 dreamswang 2012-04-13 打赏举报 回复 [Quote=引用 43 楼 的回复:]
什么叫“算法第一”?什么时候数据结构和算法被分家了?要不是能用指针模拟汇编语言的寻址技巧,C语言的运行效率还能这么高吗?
[/Quote]
C语言效率高,仅仅是因为有指针么?
算法和数据结构为什么不能分开?貌似我读书的时候就是算法和数据结构分开学的啊! 自由建客 2012-04-13 打赏举报 回复 dreamswang,课程分开只是突出侧重而已,并不是说两者事实上就能分开。数据结构决定算法,算法可以反过来刺激和改进数据结构。 muyi66 2012-04-09 打赏举报 回复 什么叫“算法第一”?什么时候数据结构和算法被分家了?要不是能用指针模拟汇编语言的寻址技巧,C语言的运行效率还能这么高吗? just_someone 2012-04-09 打赏举报 回复 能对效率起作用的应该是算法和对硬件功能的全面了解,使用指针不会增加cache命中,灵活的使用cache和寄存器才会提高效率,反而少用全局变量和指针会更有效率,用指针会带来编程时的效率然后也带来调试和维护的没有效率 hello_symbol 2012-04-09 打赏举报 回复 [Quote=引用 24 楼 的回复:]
个人意见:效率高低首先看实际运行时间,然后看对应的汇编指令,再然后考量是否使用了合理的算法,恐怕最后才是听别人估计效率高低吧。
[/Quote]
反了吧,算法第一,相应汇编指令 或者 叫 写法第二 tigershi2000 2012-04-09 打赏举报 回复 #define container_of(ptr, type, member) \
((type *) ((char *) (ptr) - offsetof(type, member)))
看不懂的话,搜一下list_entry
看懂这个就明白为什么指针快了,哪怕你是百万千万链表,用指针只进行一次运算。
楼上这么多回复,基本上都是简单认为指针就是数组下标,看问题要深入一点啊,星星多了,功力也要加深才行
ioaq 2012-04-08 打赏举报 回复 [Quote=引用 2 楼 的回复:]
因为指针直接指向需访问的数据,不必再通过其它计算来进行间接访问。比如二维数组,想要访问其中的成员计算机必须先做一次乘法运算和一次加法运算,而设计适当的指针访问时就完全不必做这些操作。
指针是对汇编语言里经常采用的寻址方式的模拟,它使得高级语言也能用类似汇编语言的手段来对数据进行处理,直接、简单,从而大大提高处理效率。
不过这个直接、简单是对机器而言,对人来说这不是我们日常的思维方式,……
[/Quote]
请问可以具体说说么?
一次乘法运算和一次加法运算时什么意思啊? chen870201 2012-04-08 打赏举报 回复 大家众说纷纭,但看样子楼主不接受 zmkkobe 2012-04-08 打赏举报 回复 指针直接操作内存的,呵呵 i945800687 2012-04-08 打赏举报 回复 [Quote=引用 2 楼 的回复:]
因为指针直接指向需访问的数据,不必再通过其它计算来进行间接访问。比如二维数组,想要访问其中的成员计算机必须先做一次乘法运算和一次加法运算,而设计适当的指针访问时就完全不必做这些操作。
指针是对汇编语言里经常采用的寻址方式的模拟,它使得高级语言也能用类似汇编语言的手段来对数据进行处理,直接、简单,从而大大提高处理效率。
不过这个直接、简单是对机器而言,对人来说这不是我们日常的思维方式,初……
[/Quote]
+1,直接访问,就是使用的时候需要多加注意 zhanglingxiang 2012-04-08 打赏举报 回复 谢谢大家 redleaves 2012-04-08 打赏举报 回复 并不是指针效率高.指针只是C/C++中,直接访问内存的一种机制.无所谓高效低效的.
只不过,利用直接访问内存这种特性,可以构造出比较高效的程序.但并不意味着用了指针,就是高效的.
像楼上说的那样,指针对编译优化是一种阻碍.使用指针,你就要对程序负更多的责任. 自由建客 2012-04-08 打赏举报 回复 [Quote=引用 31 楼 的回复:]
二十七楼,《现在编译原理》载,指针恰是难以优化的东西,而下标则很容易,尤其是对于向量机。
[/Quote]
《现代体系结构的优化编译器》第十二章「C 语言和硬件设计中的依赖」 自由建客 2012-04-08 打赏举报 回复 错了,不是《现代编译原理》,是哪本书我要查查才知道。 zaixiankaifa 2012-04-08 打赏举报 回复 这个是常识 自由建客 2012-04-08 打赏举报 回复 二十七楼,《现在编译原理》载,指针恰是难以优化的东西,而下标则很容易,尤其是对于向量机。 muyi66 2012-04-08 打赏举报 回复 访问数组时的做法是用数组的首位置加上要访问成员的偏移值来确定具体的数据存储位置的。为了得到二维数组成员的偏移值,系统首先要用第一维的下标乘以第二维大小,而后再加上第二维下标,这样才能计算出指定成员在数组中的位置。如果数据类型的尺寸不是单字节的,还要再用移位或乘法去计算出最终的偏移地址,最后采用基址加偏移来得到数据存储在内存的具体位置。 qiuhui00 2012-04-07 打赏举报 回复 直接操作内存 mingcsharp 2012-04-07 打赏举报 回复 楼上怎么没图标呢 fishion 2012-04-07 打赏举报 回复 不用进行数据的拷贝,直接使用内存的数据 加载更多回复(24) C 和指针 pdf 中文版 pdf、完美书签大纲、方便查找阅读 经典著作 C/C++指针经典资料大全 C/C++指针经典资料大全,十余部经典资料书籍,是您精通C指针的理想教程。 再论论指针(指针详细剖析) 指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语言相比至少在效率方面高人一筹。但是,由于指针的原理与使用方式跟人们通常的思维习惯有较大的差别,造成了指针比C语言其它概念难理解得多,这使得对指针认识不足成为了一种在C程序员中普遍存在的现象,这种不足必然导致程序员在指针的使用过程中不断遭受挫折,挫折多了,指针俨然变成一道无法逾越的难关,恐惧感也就油然而生了。在恐惧感面前,某些程序员甚至产生了要避免使用指针的念头,这是非常不可取的。指针是如此犀利,正是它才使得C语言威猛无比,如果就这样把它放弃了,那么C语言就算是白学了。我们应当让指针成为你手中那把砍掉索伦手指上魔戒的举世无双的纳西尔圣剑,而不是成为你心中永远的魔戒。 免费下载:C语言难点分析整理.doc 1. C 语言中的指针和内存泄漏 5
2. C语言难点分析整理 10
3. C语言难点 18
4. C/C++实现冒泡排序算法 32
5. C++中指针和引用的区别 35
6. const char*, char const*, char*const的区别 36
7. C中可变参数函数实现 38
8. C程序内存中组成部分 41
9. C编程拾粹 42
10. C语言中实现数组的动态增长 44
11. C语言中的位运算 46
12. 浮点数的存储格式: 50
13. 位域 58
14. C语言函数二维数组传递方法 64
15. C语言复杂表达式的执行步骤 66
16. C语言字符串函数大全 68
17. C语言宏定义技巧 89
18. C语言实现动态数组 100
19. C语言笔试-运算符和表达式 104
20. C语言编程准则之稳定篇 107
21. C语言编程常见问题分析 108
22. C语言编程易犯毛病集合 112
23. C语言缺陷与陷阱(笔记) 119
24. C语言防止缓冲区溢出方法 126
25. C语言高效编程秘籍 128
26. C运算符优先级口诀 133
27. do/while(0)的妙用 134
28. exit()和return()的区别 140
29. exit子程序终止函数与return的差别 141
30. extern与static存储空间矛盾 145
31. PC-Lint与C\C++代码质量 147
32. spirntf函数使用大全 158
33. 二叉树的数据结构 167
34. 位运算应用口诀和实例 170
35. 内存对齐与ANSI C中struct内存布局 173
36. 冒泡和选择排序实现 180
37. 函数指针数组与返回数组指针的函数 186
38. 右左法则- 复杂指针解析 189
39. 回车和换行的区别 192
40. 堆和堆栈的区别 194
41. 堆和堆栈的区别 198
42. 如何写出专业的C头文件 202
43. 打造最快的Hash表 207
44. 指针与数组学习笔记 222
45. 数组不是指针 224
46. 标准C中字符串分割的方法 228
47. 汉诺塔源码 231
48. 洗牌算法 234
49. 深入理解C语言指针的奥秘 236
50. 游戏外挂的编写原理 254
51. 程序实例分析-为什么会陷入死循环 258
52. 空指针究竟指向了内存的哪个地方 260
53. 算术表达式的计算 265
54. 结构体对齐的具体含义 269
55. 连连看AI算法 274
56. 连连看寻路算法的思路 283
57. 重新认识:指向函数的指针 288
58. 链表的源码 291
59. 高质量的子程序 295
60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297
61. C语言常见错误 320
62. 超强的指针学习笔记 325
63. 程序员之路──关于代码风格 343
64. 指针、结构体、联合体的安全规范 346
65. C指针讲解 352
66. 关于指向指针的指针 368
67. C/C++ 误区一:void main() 373
68. C/C++ 误区二:fflush(stdin) 376
69. C/C++ 误区三:强制转换 malloc() 的返回值 380
70. C/C++ 误区四:char c = getchar(); 381
71. C/C++ 误区五:检查 new 的返回值 383
72. C 是 C++ 的子集吗? 384
73. C和C++的区别是什么? 387
74. 无条件循环 388
75. 产生随机数的方法 389
76. 顺序表及其操作 390
77. 单链表的实现及其操作 391
78. 双向链表 395
79. 程序员数据结构笔记 399
80. Hashtable和HashMap的区别 408
81. hash 表学习笔记 410
82. C程序设计常用算法源代码 412
83. C语言有头结点链表的经典实现 419
84. C语言惠通面试题 428
85. C语言常用宏定义 450 C语言实例解析精粹 C语言初学到精通必备资料
C语言
70,025
社区成员
243,260
社区内容
发帖 与我相关 我的任务 C语言 C语言相关问题讨论 复制链接
扫一扫 分享 确定 社区描述 C语言相关问题讨论 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告 试试用AI创作助手写篇文章吧
+ 用AI写文章