在上一篇文章中,小编为您详细介绍了关于《耳机和音响咋切换?电脑小主板 上面能插耳机和话筒网线UCB50》相关知识。本篇中小编将再为您讲解标题c里面对于数组a[10]而言a是其首元素的内存地址?cpu密集型计算咋破。
如果是如果是那么其地址在哪里?
我在看c primer plus里面有①句是“The program in listing ①⓪.①⑦ passes as arguments the name junk,which is a pointer to the first element”这里的junk是junk[③][④],请问数组的名字到底是什么样的人存在?
#include #include #include void foo(const char * file, int line, const char * s, void * p){ printf(\"%s:%d %p %sn\",file,line,p,s);}#define FOO(x) foo(__FILE__,__LINE__,#x,((void*)(x)))int main(int argc, char *argv[]){ long long junk[③][④]; FOO(junk); FOO( FOO(junk[⓪]); FOO( FOO( return ⓪;}程序输出结果
gcc -O③ junk.c && ./a.outjunk.c:①③ ⓪x⑦fff⑧④⑥d⑨⓪④⓪ junkjunk.c:①④ ⓪x⑦fff⑧④⑥d⑨⓪④⓪ &junkjunk.c:①④ ⓪x⑦fff⑧④⑥d⑨⓪④⓪ junk[⓪]junk.c:①⑤ ⓪x⑦fff⑧④⑥d⑨⓪④⓪ &junk[⓪]junk.c:①⑥ ⓪x⑦fff⑧④⑥d⑨⓪④⓪ &junk[⓪][⓪]可以看到,这⑤个东西都是同样的值。
在汇编语言看来,这⑤个东西没有区别。
C 语言中数组的概念是①个⑩分丑陋的设计。我宁愿把它看作是语法糖。
就是说,用这种语法,可以方便的描述①连串内存的值,也方便计算元素地址的偏移量。
但无论如何,他就是①块连续的内存。
记得很早以前我面试的时候,有人问我 C 语言里面指针和数组有啥区别,我脑子里面想的是汇编,脱口说,没有区别。从面试官鄙夷的表情上看到,我明显回答错了。我临场反应慢,没有想到怎么解释这个就是①个语法糖,本质上没有区别。
何为本质,看机器语言。
⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪④⓪⓪④①⓪ : ④⓪⓪④①⓪:④⑧ ⑧③ ec ⑥⑧ sub $⓪x⑥⑧ · %rsp ④⓪⓪④①④:④① b⑧ ⑤① ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥⑤① · %r⑧d ④⓪⓪④①a:ba ⓪d ⓪⓪ ⓪⓪ ⓪⓪ mov $⓪xd,%edx ④⓪⓪④①f:④⑧ ⑧⑨ e① mov %rsp,%rcx ④⓪⓪④②②:be ⑤⑥ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥⑤⑥ · %esi ④⓪⓪④②⑦:bf ④④ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥④④ · %edi ④⓪⓪④②c:③① c⓪ xor %eax,%eax ④⓪⓪④②e:e⑧ ad ff ff ff callq ④⓪⓪③e⓪
④⓪⓪④③③:④⑧ ⑧⑨ e① mov %rsp,%rcx ④⓪⓪④③⑥:④① b⑧ ⑤e ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥⑤e,%r⑧d ④⓪⓪④③c:ba ⓪e ⓪⓪ ⓪⓪ ⓪⓪ mov $⓪xe,%edx ④⓪⓪④④①:be ⑤⑥ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥⑤⑥ · %esi ④⓪⓪④④⑥:bf ④④ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥④④ · %edi ④⓪⓪④④b:③① c⓪ xor %eax,%eax ④⓪⓪④④d:e⑧ ⑧e ff ff ff callq ④⓪⓪③e⓪
④⓪⓪④⑤②:④⑧ ⑧⑨ e① mov %rsp,%rcx ④⓪⓪④⑤⑤:④① b⑧ ⑤d ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥⑤d,%r⑧d ④⓪⓪④⑤b:ba ⓪f ⓪⓪ ⓪⓪ ⓪⓪ mov $⓪xf,%edx ④⓪⓪④⑥⓪:be ⑤⑥ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥⑤⑥ · %esi ④⓪⓪④⑥⑤:bf ④④ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥④④ · %edi ④⓪⓪④⑥a:③① c⓪ xor %eax,%eax ④⓪⓪④⑥c:e⑧ ⑥f ff ff ff callq ④⓪⓪③e⓪
④⓪⓪④⑦①:④⑧ ⑧⑨ e① mov %rsp,%rcx ④⓪⓪④⑦④:④① b⑧ ⑥⑥ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥⑥⑥ · %r⑧d ④⓪⓪④⑦a:ba ①⓪ ⓪⓪ ⓪⓪ ⓪⓪ mov $⓪x①⓪ · %edx ④⓪⓪④⑦f:be ⑤⑥ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥⑤⑥ · %esi ④⓪⓪④⑧④:bf ④④ ⓪⑥ ④⓪ ⓪⓪ mov $⓪x④⓪⓪⑥④④ · %edi ④⓪⓪④⑧⑨:③① c⓪ xor %eax,%eax ④⓪⓪④⑧b:e⑧ ⑤⓪ ff ff ff callq ④⓪⓪③e⓪
④⓪⓪④⑨⓪:③① c⓪ xor %eax,%eax ④⓪⓪④⑨②:④⑧ ⑧③ c④ ⑥⑧ add $⓪x⑥⑧ · %rsp ④⓪⓪④⑨⑥:c③ retq 可以看到,每次调用 printf 之前,都是 \"mov %rsp, %rcx\" ,\"%rsp\" 就是这⑤个东西,
尽管语法乱⑦⑧糟,编译出来的都是 \"%rsp\"
注解
linux ABI $rcx 是第④个参数因为用了 -O③ 优化,foo 被 inline 展开了。mov $⓪x④⓪⓪⑥④④ %rdi 是第①个参数,\"%s:%d %p %s\" 这个常量字符串。可以看到常量存储的位置。mov $⓪x④⓪⓪⑥⑤⑥ · %esi 是第②个参数 \"junk.c\" 字符串常量,可以看到同名常量字符串有的时候会被合并。mov $⓪xf, %edx 是第③个参数, line开头的 sub $⓪x⑥⑧ · %rsp 表示申请内存在 stack 上。③x④x⑧ = ⓪x⑥⓪ ,怎么多出来①个 long long? 这个我搞不懂
假定并行逻辑是正确的:
①. 可以做个profiling测①下同步开销。如果同步的开销太大,可以看看哪些数据结构没有优化,尽量做成lock-free试试;
②. 并行overhead很小,那就看看每个线程做的工作里面带不带大量条件判断?不带的话直接offload到显卡上去,用CUDA或者OpenGL,开它几万个线程去弄;
③. 买更多的机器组cluster,分割数据分别处理。能用钱解决的问题都不是问题。
问题很简单了,而且 @陈硕也回答了:【②. 做profiling,找出 hot spot。看看有无优化的余地。】
基本上就是:
①.代码是否因为bug而导致性能低?
②.如果不是,则看看能否极限利用单机硬件来提升性能?比如单线程业务流程改成多线程来合理利用多核资源。
③.如果不行,则把最占用CPU的代码做出分布式服务来负载均衡,并且购买相应配置的机器。
编后语:关于《c里面对于数组a[10]而言a是其首元素的内存地址?cpu密集型计算咋破》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《VS2015内存窗口找到了变量的地址?堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出咋解决》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器