Chinaunix

标题: 又发现一个C和C++的小不同 [打印本页]

作者: x5miao    时间: 2011-10-20 22:23
标题: 又发现一个C和C++的小不同
本帖最后由 x5miao 于 2011-10-20 23:05 编辑

今天在看《C++primer》的时候又新发现一个C和C++的小小不同点。C中if,switch,while的条件只能是表达式不能是声明;而在C++中这些地方也允许带有初始化的定义。因此while(int c=getchar())在C++中合法但在C中不合法。

哎,觉得C和C++里面像class这些显而易见的区别倒还好,那些看起来一样但有区别的细微的地方才是最烦人的。放在一起很容易搞混。



更正:C99允许for的初始化部分是带有初试器的定义了
作者: AD8018    时间: 2011-10-20 22:33
有啥C有的,C++没有?

restrict ?
作者: pmerofc    时间: 2011-10-20 22:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 塑料袋    时间: 2011-10-20 22:39
main的递归
pmerofc 发表于 2011-10-20 22:34



    你知不知道main为啥不能递归,main之前做了什么???
作者: AD8018    时间: 2011-10-20 22:53
你知不知道main为啥不能递归,main之前做了什么???
塑料袋 发表于 2011-10-20 22:39



塑兄,我觉得你的引导方向错了。

“之前” 和 "之后“ 都不应该是个问题。
只要调用约定不变,就没有道理不允许递归main.

所以我估计,问题应该出在调用main的方式本身。
作者: pmerofc    时间: 2011-10-20 23:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: 塑料袋    时间: 2011-10-20 23:02
塑兄,我觉得你的引导方向错了。

“之前” 和 "之后“ 都不应该是个问题。
只要调用约定不变,就 ...
AD8018 发表于 2011-10-20 22:53



    没错,以你为准吧。

   那就是不管为啥吧?怎么这个main他就这么难递归????
作者: OwnWaterloo    时间: 2011-10-20 23:05
回复 2# AD8018

variable length array, designated initializer...
作者: 塑料袋    时间: 2011-10-20 23:06
塑兄,我觉得你的引导方向错了。

“之前” 和 "之后“ 都不应该是个问题。
只要调用约定不变,就 ...
AD8018 发表于 2011-10-20 22:53



    晕,我没错啊,就应该问main之前到底做了什么啊?

   

   我也没说main之前不能递归,之后就能递归。 还是别说这些细节问题了,我脑子不好使,转不过这么多弯来。
作者: OwnWaterloo    时间: 2011-10-20 23:07
回复 5# AD8018

武夫就应该亮肌肉,让他动脑子不是为难他么……
作者: 塑料袋    时间: 2011-10-20 23:10
回复  AD8018

武夫就应该亮肌肉,让他动脑子不是为难他么……
OwnWaterloo 发表于 2011-10-20 23:07



    这里是技术论坛,不是汉语论坛。 你玩的那些有意思么?

   我的肌肉就是architecture,kernel,glibc,xwindow这些方面,都不是外行。
作者: AD8018    时间: 2011-10-20 23:11
晕,我没错啊,就应该问main之前到底做了什么啊?

   

   我也没说main之前不能递归,之后 ...
塑料袋 发表于 2011-10-20 23:06



    晕,这么说要区分下 “调用main之前” 和 “main自身执行之前”
这两个还差个“调用”呢。。

“调用” 之前,还是有歧义的,只算跳入函数地址这条指令,还是前面的准备工作都要算上。。。
作者: OwnWaterloo    时间: 2011-10-20 23:13
回复 11# 塑料袋

还是别说这些细节问题了,我脑子不好使,转不过这么多弯来。
塑料袋 发表于 2011-10-20 23:06


我只是猜到你会被AD8018绕晕。
转不过弯可是你自己说的。
作者: AD8018    时间: 2011-10-20 23:19
搜到一个说法,我相信这个是不可递归的理由
The function main shall not be used (3.2) within a program. The linkage (3.5) of main is implementation-defined.

http://stackoverflow.com/questio ... urse-into-main-in-c
作者: AD8018    时间: 2011-10-20 23:20
回复  AD8018

variable length array, designated initializer...
OwnWaterloo 发表于 2011-10-20 23:05


Tks! 学习了
作者: OwnWaterloo    时间: 2011-10-20 23:20
回复 11# 塑料袋

C你也不是外行吧? 能帮我解决个问题么?

有如下定义:

  1. enum {
  2.       chinese,
  3.       math,
  4.       english,
  5.       end,
  6. };

  7. typedef struct
  8. {
  9.       char name[12];
  10.       int mark[end];
  11. } student;
复制代码
该如何用 qsort(这算是libc吧?) 实现

  1. void sort(student s[], int n, int c);
复制代码
使得 sort(s, n, chinese) 是按语文成绩排序。
sort(s,n, math)按数学, english按英语?


同时考虑一个问题: 如果enum(以及student)演化为这样

  1. enum {
  2.       chinese,
  3.       math,
  4.       english,
  5.       physics,
  6.       chemistry,
  7.       biology,
  8.       end,
  9. };
复制代码
其他代码会做什么样的变化?
作者: 塑料袋    时间: 2011-10-20 23:22
回复  塑料袋

我只是猜到你会被AD8018绕晕。
转不过弯可是你自己说的。
OwnWaterloo 发表于 2011-10-20 23:13


绕晕就绕晕呗,这怎么了?

你要是能在architecture,kernel,x-window等方面上绕晕我,那我就算你NB。



但是瞅你这总喜欢玩小聪明的作风,恐怕这辈子没希望在上边几个方向赶上我了。
作者: AD8018    时间: 2011-10-20 23:25
回复 16# OwnWaterloo


    这题有难度啊,qsort缺个参数么。。。
作者: OwnWaterloo    时间: 2011-10-20 23:26
回复 17# 塑料袋

以己之长以人之短,不觉得胜之不武么?
作者: 塑料袋    时间: 2011-10-20 23:31
回复 19# OwnWaterloo


    你这是学生课本上才会出现的题目啊,处在我的位置,你说我看这些干什么?那不真成了脑子有病啊?


   上个帖子里问我什么单练双链排序的,我都往回搂了半天,算是认真回答了,怎么还来这些啊?
作者: OwnWaterloo    时间: 2011-10-20 23:31
回复 18# AD8018

嘘~ 你这一说…… 还怎能让对方轻敌呢……
这不是逼着我换一题么?
作者: 塑料袋    时间: 2011-10-20 23:32
回复  塑料袋

以己之长以人之短,不觉得胜之不武么?
OwnWaterloo 发表于 2011-10-20 23:26



    那我问你,你觉得问我哪里长?你哪里长?
作者: OwnWaterloo    时间: 2011-10-20 23:33
回复 22# 塑料袋

你觉得我那是学生课本上的题, 而AD8018看出玄机了。这就是差距。

我上面一贴是不是高估你了?
作者: OwnWaterloo    时间: 2011-10-20 23:35
下一题都想好了…… 这是出呢还是不出呢
作者: 塑料袋    时间: 2011-10-20 23:35
回复  塑料袋

你觉得我那是学生课本上的题, 而AD8018看出玄机了。这就是差距。

我上面一贴是不是高 ...
OwnWaterloo 发表于 2011-10-20 23:33



    没错,差距差距。

   不管什么时候,architecture,kernel,loader & linker,X-window,任意那方面,你觉得能和我讨论两句的时候,再来找我吧.

    我认为这些是一个系统的基础,是系统运行的本质。
作者: nketc    时间: 2011-10-20 23:37
这自是说了c++方便性的一方面。
这按照c的观点来说完全是脱了裤子放屁-----多次一举。

当然c++的这方便的改进还是很有人情味的。
作者: 幻の上帝    时间: 2011-10-20 23:38
我不是早说过了么。。各种奇葩的for(int a(0); float b = 2; ++a)之类。。
那啥,关于main,C++是根本禁止used within a program,也就是说不光递归,&::main、int(*p)() = ::main之类的也算ill-formed。
作者: AD8018    时间: 2011-10-20 23:46
这个声明
   void test();

在C和C++看起来,含义也不一样。解释这个事情,比较适合pmerofc来做。
作者: OwnWaterloo    时间: 2011-10-20 23:48
回复 25# 塑料袋

记得我在"C不过是山寨pascal"里回你的, 究竟什么是本质吗? 那一串反问。
你所谓的本质,其实更准确的说法是你能看到与摸到的层次
本质是无底线、 细节是无穷尽的。
如果不学会"研究无法看到与摸到的事物","研究事物的共性"的方法,很难有什么造诣。
你说的那些都只是知识,很难算做技能
知识是学不完的, 但技能可以提高学习知识的速度、深度、广度。

外功有余而内功不足 —— 这算是总结吧。


当然,在你看来细节才是金子,其他都是瓦砾 —— 这我真没法说服你……
作者: nketc    时间: 2011-10-20 23:49
这个声明
   void test();

在C和C++看起来,含义也不一样。解释这个事情,比较适合pmerofc来做。
AD8018 发表于 2011-10-20 23:46



    你认为他能解释的清吗?
作者: OwnWaterloo    时间: 2011-10-20 23:50
回复 28# AD8018

void test(); /* C */
void test(...); // C++

void test(void); /* C */
void test(); // C++

void test(T x, ...); /* C or C++ */

似乎自己被坑过……
作者: 塑料袋    时间: 2011-10-20 23:50
回复  塑料袋

记得我在"C不过是山寨pascal"里回你的, 究竟什么是本质吗? 那一串反问。
你所谓的本质 ...
OwnWaterloo 发表于 2011-10-20 23:48



    我不会说汉语,OK?

   你可以和我谈技术,尤其是大型开源项目的逻辑,但是别给我说汉语了,我玩不起,行了么?
作者: OwnWaterloo    时间: 2011-10-20 23:51
回复 32# 塑料袋

我上面给了代码你不屑玩啊……
作者: 塑料袋    时间: 2011-10-20 23:52
回复 33# OwnWaterloo


    我 操 你 妈,滚!

   爱咋地咋地
作者: OwnWaterloo    时间: 2011-10-20 23:53
回复 34# 塑料袋

你要这样,我表示我玩不起了……
作者: pmerofc    时间: 2011-10-20 23:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: nketc    时间: 2011-10-20 23:56
回复 29# OwnWaterloo


    本质?
我觉得c的本质是提供了该提供的,其它的hacker们上吧,于是大家就争论了起来,R应该含笑酒泉了吧。
c抽象了硬件,和系统相互影响。
作者: nketc    时间: 2011-10-20 23:57
回复 34# 塑料袋


    请注意素质。有理说理,没理道歉。
作者: AD8018    时间: 2011-10-20 23:59
好脚不踩臭狗屎。现在理解小时候老人为什么不让我逗傻子玩了
pmerofc 发表于 2011-10-20 23:56



    你这样说有点过分,因为你们的水平差距,也不在一个量级上。
先将18楼的程序写出来,我想你会有一些其他的认识。
作者: pmerofc    时间: 2011-10-21 00:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2011-10-21 00:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: nketc    时间: 2011-10-21 00:04
回复 16# OwnWaterloo


    对于策略,我们提供一种机制,但是策略(业务)最终由用户决定。
作者: davelv    时间: 2011-10-21 00:06
本帖最后由 davelv 于 2011-10-21 00:10 编辑

回复 16# OwnWaterloo
不考虑多线程的话,可以用静态/全局变量去解决,这个最容易想到和解决,否则的话

  1. void sort(stduent s[], int n, int c)
  2. {
  3.         qsort(&(s->mark[c]), n, sizeof(s[0]),compare);
  4. }
复制代码
这样如何?

刚才写错了。。忘记student的内部构造
作者: OwnWaterloo    时间: 2011-10-21 00:07
回复 18# AD8018

貌似隐藏答案也没什么用了……

要最直接的,其实就是每门学科实现一个函数,原型int (*)(void const*, void const*),比较mark[i ] i在该函数中为常量。
但你也应该察觉到这里面的坏味道了。


而在支持closure的语言里,函数绑定局部变量是自然而然的事情,根本不需要纠结这个问题。
void sort(s, n, int c)
{
      qsort( ... function(x,y) { return x.mark[c] - y.mark[c] ; }
}


其实C也可以手工实现closure,只是代价(实现代价而非运行代价)很高,不一定值得这么做。
追根究底这是qsort设计失误造成的。


最终,其实是想表明: 不是研究C才算研究。
本来在你剧透之后还想出个coroutine的呢……  看来是没必要了……
作者: AD8018    时间: 2011-10-21 00:07
TMD这跟水平有个毛关系啊。你非得逼我说出物以类聚吗
pmerofc 发表于 2011-10-21 00:03



    连TMD都出来,你是被我抓过几个bug,憋急了吗?
作者: OwnWaterloo    时间: 2011-10-21 00:09
回复 36# pmerofc

我要真把他当作傻子就不会回他了。
他肯定是有长处的,术业有专攻而已……
作者: davelv    时间: 2011-10-21 00:11
貌似43楼也不行呢,这样的话,student元素内部就乱掉了。。。
作者: nketc    时间: 2011-10-21 00:15
回复 44# OwnWaterloo


   
追根究底这是qsort设计失误造成的

qsort有啥设计失误?
作者: OwnWaterloo    时间: 2011-10-21 00:16
回复 48# nketc

你看davelv不正在挠头皮想写个compare函数出来么……
你试着写写看就知道问题了……
作者: pmerofc    时间: 2011-10-21 00:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: AD8018    时间: 2011-10-21 00:19
回复  AD8018

貌似隐藏答案也没什么用了……

要最直接的,其实就是每门学科实现一个函数,原型int ( ...
OwnWaterloo 发表于 2011-10-21 00:07



    还个解释已经很明白了。

我突然觉得,错误还是让别人去领会比较好,
否则,说什么他都不会相信。
作者: OwnWaterloo    时间: 2011-10-21 00:23
回复 51# AD8018

真要说错误也算不上…… 程序也还是可以写,但就是别扭……

说是失误吧…… 这失误也太多了……
bsearch、atexit、 signal ……
可能以前全局变量不是什么需要刻意避免的, 程序也小到不需要注册两个以上的"调用体"。
作者: nketc    时间: 2011-10-21 00:25
回复 49# OwnWaterloo


    还是闭包好啊。哈哈。
作者: pmerofc    时间: 2011-10-21 00:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: nketc    时间: 2011-10-21 00:28
就是嘛,有理说理,切勿人身攻击,特别是这么赤罗罗的。
作者: AD8018    时间: 2011-10-21 00:31
我记得是一个BUG,不是几个。当然你可以自己认为是几个
   你想以此说明什么呢??
pmerofc 发表于 2011-10-21 00:18


想说明三点:
1. 你的《C解毒》,最好改名为《C以毒攻毒》
2. 负责任的审稿员,审你的书可能会奔溃
3. 最好只挑谭老的刺,不要写任何自己的代码。不然你可能成为谭浩强第二。
作者: AD8018    时间: 2011-10-21 00:31
回复  AD8018

真要说错误也算不上…… 程序也还是可以写,但就是别扭……

说是失误吧…… 这失误也太 ...
OwnWaterloo 发表于 2011-10-21 00:23



    还是pthread_create好!
作者: nketc    时间: 2011-10-21 00:35
想说明三点:
1. 你的《C解毒》,最好改名为《C以毒攻毒》
2. 负责任的审稿员,审你的书可能会奔溃
...
AD8018 发表于 2011-10-21 00:31



    让我想到了清茶的严世蕃之死。
作者: pmerofc    时间: 2011-10-21 00:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: OwnWaterloo    时间: 2011-10-21 00:40
回复 57# AD8018

要pthread_create那个年代还没意识到这问题的话……
我对这世界绝望了……

void* f(void* x); 多好!

丫的Windows, 不管是CreateThread还是_beginthreadex……
unsigned g(void* x);
有时候想多返回点东西又傻眼了……   返回值只好空着, 用传出参数……

虽然C语言是图灵完备的, 但总有许多地方(尤其是较早年代的代码)的设计总那么憋屈……
作者: AD8018    时间: 2011-10-21 00:40
我继续抓辫子:
http://blog.chinaunix.net/space. ... blog&id=2907544
     但好歹是有所得:代码中不写实参、形参,省去了传递参数的开销。

-------------------------------------------------------------------------

改进三到改进四,

将函数参数,改为全局变量(抱歉我不习惯说外部变量),
认为是“有所得”。

但是你晓不晓得,在一些系统上,
用全局变量的开销,比这里传参数的开销更大。
不但不是“有所得”,还是“有所失”。

比如,ARM上,它这里传参数,只要放寄存器R0, R1..就行了,基本无开销。
拿全局变量,需要先抓“地址”的偏移放到寄存器,
然后从地址的偏移取得全局变量的地址,
然后才能用全局变量。

抱歉我想用丰富的经验打败你。。。
作者: nketc    时间: 2011-10-21 00:41
大神们都睡了吧。
作者: AD8018    时间: 2011-10-21 00:44
让我想到了清茶的严世蕃之死。
nketc 发表于 2011-10-21 00:35



    谩骂改变不了现状。
除了这三条,我其他关于他的帖子,大多是拿程序说话,不像某些人。
作者: OwnWaterloo    时间: 2011-10-21 01:00
回复 61# AD8018

>> 比如,ARM上,它这里传参数,只要放寄存器R0, R1..就行了,基本无开销。
>> 拿全局变量,需要先抓“地址”的偏移放到寄存器,
>> 然后从地址的偏移取得全局变量的地址,
>> 然后才能用全局变量。

这里的"地址",是变量访问的一系列指令的地址?
arm? 又是啥os呢? executable必须是位置无关的?
作者: AD8018    时间: 2011-10-21 01:37
arm? 又是啥os呢? executable必须是位置无关的?
OwnWaterloo 发表于 2011-10-21 01:00



    指的是ARM的芯片,os没关系,executable可以位置相关。


他的文中,“改进四”中的全局变量:
int array[10];

函数要拿到这个array中拿值, 通常需要
   LDR R0, [PC, 相对PC的偏移]
   LDR R1, [R0, array中的偏移]

编译程序需要在相对PC的偏移处,预先填一个值,这个值为array的地址。
(相对PC的偏移,这个编译时编译进指令里,不需要先抓“地址”的偏移放到寄存器,这点我前面多写了,抱歉)

---------------------------------------------
他的文中,“改进三”中的用局部变量:
int main()
{
  float array[10];
  ...
  find_max( array , 10 );
  find_min( array , 10 );
  find_ave( array , 10 );
  ...
}
array只是某个时刻的栈指针SP的值,
先 MOV R0, SP
调用约定,传递前几个参数,直接用R0,R1...,
于是这是后传参数,直接拿R0,零开销。


相对来说,“改进四”中,每次到find_**函数里,要多执行一句读内存,
      LDR R0, [PC, 相对PC的偏移]
所以不用全局变量,还是划算一点。
作者: OwnWaterloo    时间: 2011-10-21 01:58
回复 65# AD8018

>>   指的是ARM的芯片,os没关系,executable可以位置相关。

我觉得是否位置无关是os相关的吧?
比如同样是 i386, Windows就不支持位置无关……
以前玩wince(课程需要……)时不懂这个……  没研究过wince+arm是否是位置无关的……


>>   LDR R0, [PC, 相对PC的偏移]
>>   LDR R1, [R0, array中的偏移]
>>   编译程序需要在相对PC的偏移处,预先填一个值,这个值为array的地址。

这两处说法有矛盾? 代码是准确的?
编译器 LDR R0, [PC, stub]
链接器 LRD R0, [PC, offset]  该指令地址+offset=array地址
这样?

这就是位置无关代码吧?
不过,既然cpu可以相对PC获取数据,没有缺乏这种指令的cpu上的效率损失,直接位置无关可能更好……
作者: AD8018    时间: 2011-10-21 02:34
位置无关这个概念有待考证 ----

代码没有错,从反汇编抄过来的。
这里,LDR R0,[PC, offset]
取得一个“固定”的变量地址。
变量地址写死在程序里,我认为是位置相关。

如果位置无关,应该R9由加载器存放数据的基础地址,
LDR R0,[PC, offset] 取出数据相对于R9的偏移。
在结合R9+偏移,得到数据的实际地址。更麻烦一点。
作者: AD8018    时间: 2011-10-21 02:38
65楼提到LDR,
其代码是位置无关的,
数据是位置相关的。
executable应该包括代码+数据,所以还是位置相关的。

有点绕了。。。
作者: AD8018    时间: 2011-10-21 02:42
事实上,俺最近玩的那颗ARM, 如果不考虑数据,
看最终生成的代码,全是位置无关的(在禁止armcc位置无关的选项时),
这点真令人迷惑。
作者: OwnWaterloo    时间: 2011-10-21 02:55
回复 67# AD8018

某executable/共享库中,获取数据的指令与数据之间的偏移是固定的。
只要指令的操作数是偏移而非地址,那这个executable/共享库无论加载在什么位置,该指令都不需要更多的修改。


比如 i386, call (0xe8 ) 的操作数是相对该指令的偏移。
该指令与目标之间的偏移也是固定的。
指令无论加载在什么位置都不需要更多修改。


而获取数据
mov eax, 0x123456
mov edx, [eax]
数据(地址为0x123456)与这条指令本身必须加载一个合适的位置才能正常访问。
如果没有加载在这个理想位置, 这条指令可能就要修改为
mov eax, 0x234567
mov edx, [eax]
就不是位置无关的。


arm有相对pc获取数据的指令?
存在某个 LRD ... 被指令获取的数据的地址=该指令所在地址+该指令操作数?
这样的话访问全局数据就不会像i386那么蛋疼…… 完全接受不能……
作者: AD8018    时间: 2011-10-21 03:04
回复  AD8018

arm有相对pc获取数据的指令?
OwnWaterloo 发表于 2011-10-21 02:55


有。

但有个现实的困境,他相对于pc的offset有限制,这个offset值非常小,
于是不可能让大量的数据通过pc+offset直接取得。

pc+offset处,通常只存放这些“大量数据”的起始地址。
LDR r0, [pc, offset]   
这样r0是地址,不是数据,
效果上,相当于
mov eax, 0x123456
作者: OwnWaterloo    时间: 2011-10-21 03:15
回复 71# AD8018

>> 但有个现实的困境,他相对于pc的offset有限制,这个offset值非常小
又蛋疼了……
作者: OwnWaterloo    时间: 2011-10-21 03:19
回复 71# AD8018

>> pc+offset处,通常只存放这些“大量数据”的起始地址。
>> LDR r0, [pc, offset]   
>> 这样r0是地址,不是数据

上面说错……   不是蛋疼,是这样不足以完成位置无关……
作者: OwnWaterloo    时间: 2011-10-21 03:23
回复 67# AD8018

>> 如果位置无关,应该R9由加载器存放数据的基础地址,
>> LDR R0,[PC, offset] 取出数据相对于R9的偏移。
>> 在结合R9+偏移,得到数据的实际地址。更麻烦一点。

这样应该可行了。

如果考虑共享库,executable、各个共享库之间的基础地址不同吧?
R9根据什么切换呢?

每次函数调用(如果该函数会访问本共享库全局变量)都会切换么?
作者: OwnWaterloo    时间: 2011-10-21 03:35
    "internal"
          Internal visibility is like hidden visibility, but with
          additional processor specific semantics.  Unless otherwise
          specified by the psABI, GCC defines internal visibility to
          mean that a function is _never_ called from another module.
          Compare this with hidden functions which, while they cannot
          be referenced directly by other modules, can be referenced
          indirectly via function pointers.  By indicating that a
          function cannot be called from outside the module, GCC may
          for instance omit the load of a PIC register since it is known
          that the calling function loaded the correct value.

似乎是遇见了 __attribute__(__visibility__("internal")) 与 "hidden" 行为不同的cpu了……
作者: 三月廿七    时间: 2011-10-21 08:02
回复  OwnWaterloo
你这是学生课本上才会出现的题目啊,处在我的位置,你说我看这些干什么?那不 ...
塑料袋 发表于 2011-10-20 23:31

确实是学生课本上的题目, 但是实际中就是这么用的啊, 要不然链表你是怎么用的???
听说过  软件 = 数据结构 吗?
作者: AD8018    时间: 2011-10-21 08:04
回复  AD8018

>> 如果位置无关,应该R9由加载器存放数据的基础地址,
>> LDR R0, 取出数据相对于R9的偏 ...
OwnWaterloo 发表于 2011-10-21 03:23


    R9应该由loader负责写入。
无OS裸奔下,实现过这样的简单loader,用libelf分析出代码段和数据段,写入内存。
运行代码段前,loader将数据段写入内存的地址赋值给R9。
这样就可以位置无关了。
作者: 塑料袋    时间: 2011-10-21 08:14
R9应该由loader负责写入。
无OS裸奔下,实现过这样的简单loader,用libelf分析出代码段和数据段, ...
AD8018 发表于 2011-10-21 08:04



    知道我为啥苦恼了吧

  连寻址这么个问题,都很难对他解释清楚,到最后他还扯到symbol的hidden属性上去,不骂街干什么?
作者: pandaiam    时间: 2011-10-21 09:09
回复  OwnWaterloo


    我 操 你 妈,滚!

   爱咋地咋地
塑料袋 发表于 2011-10-20 23:52



    蛋定啊,这都能骂上,定力不足。

ow的严谨和逻辑你肯定得再学学,我也得学。
作者: AD8018    时间: 2011-10-21 09:27
知道我为啥苦恼了吧

  连寻址这么个问题,都很难对他解释清楚,到最后他还扯到symbol的hidden ...
塑料袋 发表于 2011-10-21 08:14


欧阳锋和黄药师,总是互相有些苦恼的吧。。淡定,淡定。。
作者: 狗蛋    时间: 2011-10-21 10:13
我继续抓辫子:

     但好歹是有所得:代码中不写实参、形参,省去了传递参数的开销。

------------- ...
AD8018 发表于 2011-10-21 00:40



    所谓真理多走一步就是谬误,大概就是这种了。很多岔子就出在随口多加一句上。

C标准只定义了“最终是什么”,并不理睬“实际是什么”。

实际就是:
1、使用全局变量会把程序结构搅的一团糟
2、参数传递的开销,可能非常非常小,至少远比有cache失效危险的引用全局变量小(破坏了数据局部性原则)。

关于参数传递/参数调用开销,有如下事实:
1、大多函数调用约定会优先使用寄存器(而不是栈),使得传递int之类cpu支持的东东的效率非常高
2、很多RISC处理器在摆脱了复杂指令带来的复杂性之后,会用节省下来的芯片面积实现海量的寄存器,甚至至少在9X年已经提出“寄存器窗口”概念。也就是把几十甚至上百个寄存器分组使用,使得函数调用仅仅是改变寄存器组。这时函数调用、参数传递之类的开销可以忽略不计——比如实际上可能只是修改一下寄存器组选择寄存器。

这种处理器,在函数调用嵌套深度“只有”十几层的时候,可认为函数调用无开销;再大就要把调用链最靠近根的寄存器缓冲到内存了。
作者: pmerofc    时间: 2011-10-21 10:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: 狗蛋    时间: 2011-10-21 10:49
本帖最后由 狗蛋 于 2011-10-21 10:53 编辑
回复  狗蛋


    没太理解。是否你的意思是永远不应该使用外部变量?
   如果使用的话,你认为什么样 ...
pmerofc 发表于 2011-10-21 10:41



1、第一个问题,回答是“我没往前走,你走了
2、第二个,回答是:根据我个人的工程实践经验,一般来说,适合/必须用singleton解决的,用外部变量就很合适。当然,如何初始化是个头痛的问题。
作者: pmerofc    时间: 2011-10-21 10:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 三月廿七    时间: 2011-10-21 11:00
本帖最后由 三月廿七 于 2011-10-21 11:03 编辑
1、第一个问题,回答是“我没往前走,你走了”
2、第二个,回答是:根据我个人的工程实践经验 ...
狗蛋 发表于 2011-10-21 10:49


这个我也有体会, 所以 JAVA 才有了 "万物皆对象"  , 包括内置的数据类型也可以打包成对象
c 语言如果实践 singleton,  就需要把所有的外部变量放入结构体中.
面向对象的语言也都是这么做的.
作者: pmerofc    时间: 2011-10-21 11:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2011-10-21 11:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: 三月廿七    时间: 2011-10-21 11:12
本帖最后由 三月廿七 于 2011-10-21 11:13 编辑
回复  三月廿七

我对java把main()也写到类里相当看不惯
pmerofc 发表于 2011-10-21 11:06

主要还是看个人的代码设计能力, 怎么样才能做到 "高内聚,低耦合"

如果变量已经不需要向外部传递了, 那么是不是外部变量已经无所谓了..
作者: 塑料袋    时间: 2011-10-21 11:13
欧阳锋和黄药师,总是互相有些苦恼的吧。。淡定,淡定。。
AD8018 发表于 2011-10-21 09:27



    不带这么侮辱人的吧,大哥。


   敢情我和他打了半天仗,倒给别人造成一种OwnWaterloo能和我相提并论的错觉? 他能及的我知识水平的一个零头么???

   我真是没脸混CU了。
作者: AD8018    时间: 2011-10-21 11:15
回复 89# 塑料袋


   
作者: sep    时间: 2011-10-21 11:18
不带这么侮辱人的吧,大哥。


   敢情我和他打了半天仗,倒给别人造成一种OwnWaterloo能和我 ...
塑料袋 发表于 2011-10-21 11:13



    我X,你丫还真不留情面。他对语言领域的理解和严谨态度还是很牛逼的。
作者: zylthinking    时间: 2011-10-21 11:19
本帖最后由 zylthinking 于 2011-10-21 11:26 编辑
回复  AD8018

貌似隐藏答案也没什么用了……

要最直接的,其实就是每门学科实现一个函数,原型int ( ...
OwnWaterloo 发表于 2011-10-21 00:07


我没那么学术, 要是我, 单线程用全局变量, 多线程用线程本地存储。。。。。。。有啥漏洞没有.........最多实在惹不起了, 我自己写一个qsort
哦, 不好意思, 大家原谅我, 不是 "全局"变量, 是“外部”变量

其实我一直比较疑惑, "extern" 谁规定翻译成 “外部” 的, gone with wind 翻译成 飘 是因为它是文学吗???
作者: 三月廿七    时间: 2011-10-21 11:25
本帖最后由 三月廿七 于 2011-10-21 11:31 编辑
回复  三月廿七
我对java把main()也写到类里相当看不惯
pmerofc 发表于 2011-10-21 11:06

不只是java,  c#也是这样做的,
c++也是变相这样做的,比如一些人津津乐道 singleton
作者: 狗蛋    时间: 2011-10-21 11:33
不只是java,  c#也是这样做的,
c++ 也是变相这样做的, 比如 singleton
三月廿七 发表于 2011-10-21 11:25



    这个大概就是工具限制思想……手里有了锤子,看啥都是钉子;有了类,啥都得是类。

还是个人看法:一切都是类是个很失败的抽象,其实面向对象学派自己都看出来了;不过宣传口号已经深入人心了,再想换成更合理的“一切都是接口”,已经有点力不从心了……
作者: zylthinking    时间: 2011-10-21 11:34
不只是java,  c#也是这样做的,
c++也是变相这样做的,比如一些人津津乐道 singleton
三月廿七 发表于 2011-10-21 11:25


一直认为, 所谓的设计模式, 全是他妈的扯淡玩意。。。。。。就算提出的人不扯淡, 拥护的人他妈的绝大部分的人都是扯淡。。。。。。。
作者: pmerofc    时间: 2011-10-21 11:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: 三月廿七    时间: 2011-10-21 11:42
本帖最后由 三月廿七 于 2011-10-21 11:45 编辑
这个大概就是工具限制思想……手里有了锤子,看啥都是钉子;有了类,啥都得是类。

还是个人看 ...
狗蛋 发表于 2011-10-21 11:33


先记住你说的这句话, 过后我再仔细琢磨琢磨...
作者: 三月廿七    时间: 2011-10-21 11:46
本帖最后由 三月廿七 于 2011-10-21 11:56 编辑
一直认为, 所谓的设计模式, 全是他妈的扯淡玩意。。。。。。就算提出的人不扯淡, 拥护的人他妈的绝大 ...
zylthinking 发表于 2011-10-21 11:34

估计是没有什么值得称道的了, 然后就只有整一些名词忽悠忽悠...
作者: zylthinking    时间: 2011-10-21 12:50
我没那么学术, 要是我, 单线程用全局变量, 多线程用线程本地存储。。。。。。。有啥漏洞没有....... ...
zylthinking 发表于 2011-10-21 11:19


靠, 没有多线程的事, 谁保证 qsort了一半, 还有另一个线程能预测 students 数组顺序?
如果单线程, 谁说这个不行

void sort(stduent s[], int n, int c)
{
        qsort(&(s->mark[c]), n, sizeof(s[0]),compare);
}

有没有人以为踩住我的尾巴了???
作者: x5miao    时间: 2011-10-21 13:06
本帖最后由 x5miao 于 2011-10-21 13:08 编辑

回复 99# zylthinking

void sort(stduent s[], int n, int c)
{
        qsort(&(s->mark[c]), n, sizeof(s[0]),compare);
}

    你这样排序出来的结果绝对是错的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2