| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4791 人关注过本帖
标题:自认为基础很好的请进,反正我是不信我学好了helllo word!
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
字节是否对齐可由编译开关设置,不要想当然它一定要对齐,对齐只是技术手段(怎么对齐是视CPU特定情况而定的),那不属于理论范畴。对齐处理不会影响结构体中每个变量本身的占位空间,只影响其偏移量,只是为了CPU寻址方便而做的技术性调整。把这个东西当了不得的原理来看待,叫主次不分。要考虑字节对齐,你可以在设计结构体的时候就考虑了,所有数据都采用偶数字节空间,那么编译器就没这种多余的举动。

字节对齐是优化技术问题,不是计算机理论问题。

授人以渔,不授人以鱼。
2011-08-13 07:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 57楼 风生钧起
你以为略去2问而已。告诉你什么叫野指针、它是怎么来的,那么好不好、怎么利用是你自己的事。世事无绝对,我不会一口咬定什么东西肯定是不好的、是完全废物的,结论在于你怎么利用。很多东西有副作用,包括C正宗的东西,有人能用,有人不能用,有人用不好,有人专门利用副作用,有人极力避免副作用,这些都是人的理念问题。黑客技术好不好?克隆人好不好?安乐死好不好?这些都是人的价值观问题,看你自己的了。

getchar()函数是很多人用的,但它的危害性其实也很大,很多程序员就栽在这个东西上面,但谨慎的人、了解它的副作用的人,就会在设计中避免错误,或者刻意使用。事实上,这个函数的危害性,就是这个函数的编制者利用副作用思想搞出来的,身兼多职,那是汇编的风格。在返回值中既包含正常值,也包含非法值,故意设计非法值返回是告诉使用者出错,但使用者有时很容易忽略这种非法返回值,因为他从来不会想到getchar()这种读取字符的函数会返回一个负数,因为字符码永远是正的,特别在汉字环境中,负字符码意味着那是汉字字符,这时把它当错误是很难分辨的。但这种汇编式的思维,正是很多C程序员热衷的东西,他们大量使用这种方式作为函数的出错告知模式(事实上我虽然极力回避,有时也不可避免地使用,就是因为学C++之前就学了C),当秘籍神器般来用,这叫绝招心理。

授人以渔,不授人以鱼。
2011-08-13 07:58
笨蛋编程
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:65
专家分:131
注 册:2011-8-11
收藏
得分:0 
太崇拜楼主了 十天就这样 服 你就是一天才
2011-08-13 08:50
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
楼主看了十天就这样,真是学C的奇才啊
佩服!!!
2011-08-13 08:53
asdf535463
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2011-8-10
收藏
得分:0 
你的问题很难讲清
你还是自己先把书看一遍吧,不管你懂不懂,
然后照着例题打一遍,
你应该会知道你想知道的。
2011-08-13 09:37
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 59楼 风生钧起
第二个代码我在VS2010里面已经运行过了,还有一种数据结构叫Vector,它拥有数组和链表的特性。
收到的鲜花

My life is brilliant
2011-08-13 09:57
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 61楼 TonyDeng
为什么编译器首先采取更浪费空间的解决方案?或者说如果不采用字节对齐很难实现这个功能?如果可以让编译器不用字节对齐,那么你知道如何关掉它吗?我用的是MinGW,我查了他的文档也没有找到关于字节对齐的信息。

My life is brilliant
2011-08-13 10:01
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
10天学了那么多? ⊙﹏⊙b汗

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-08-13 10:01
不归鹄
Rank: 9Rank: 9Rank: 9
来 自:冥王星
等 级:蜘蛛侠
威 望:4
帖 子:491
专家分:1380
注 册:2009-12-20
收藏
得分:10 
LZ乃天人也,10天可以问出这样的问题,不错不错。想想偶3星期学完C确实惭愧惭愧,不过调用main函数偶也是刚听说啊,难道LZ想让程序无限的运行下去?或者想要重复使用程序的功能?当然用全局变量控制循环的话可以不死机啦,不过重复使用程序用个循环包起整个main的内容不就得了?就像丫的消息循环啥的。。。

内存问题?要想弄清楚不搞点汇编是过不去了

野指针?你不把指针放逐怎么会出现“野”人指针,你可是你的程序的大神啊,想干什么都是你说的算,你让人叫变野,人家也只有野了,所以说做神要有责任心,不要随随便便造指针、造变量,造了也要初始化啥的,用完要谢谢人家

链表和数组?还有队列、堆栈、树、图呢,要想搞清楚这些问题,看看数据结构吧,不过后面还有数据库呢,路漫漫其修远兮,吾将永不翻身也。。。

结构体的大小?看来LZ买的书很烂呐,学计算机LZ就别想着买地摊货了,要买就买 Made in America  。几大百一本,一本上千页的给力货,授业解惑全靠它了,没办法,计算机科学是舶来品,标准都是别人定的呀,国内出的好书没几本啊……(想想这个学期花了这么多钱买书,现在只有清茶淡饭了,要不这个暑假只有滚回家去了,不过看到那么后本后本的书,额肚子就不饿了……)

宏和类与析构函数?看来LZ买的书不是烂,而是大杂烩了(大杂烩和烂哪个表达的内容更突出这本书的……烂?),类和析构函数是面向对象的产物,那是C++、java、C#的东东,要学?学完C就学C++吧,一脉相承,好学,嘿嘿……突破面向对象的思想,境界一提高就一马平川,一步青云了。。。至于宏嘛……那东西没什么大不了,那是为了编辑、编译代码之类而设计的,和程序整体结构没什么大的关系。。。知道会用就OK

以上乃胡诌也,本人刚从精神病医院出来。。

说了这么多。我只不过想接分而已,额乃大神之大神也,非大神也,回答不了这些问题,哈哈…………茶,好喝。。。
收到的鲜花

2011-08-13 10:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
关于字节对齐的问题,详细的解释请阅读《Windows 核心编程》一书,这里摘要补充说明一下。

在x86 CPU体系中,这种CPU在作地址访寻时,当地址的值是偶数时,效率最高,如果是奇数,CPU要退回再进,即要两个动作,此时不及一个动作快。因此,当编译器编译程序时,为使程序的执行效率提高,就会考虑具体运行环境,作出针对性的处理,这个处理动作就是把数据放在偶数地址上开始,如果数据本身的长度是奇数,就把下一个数据隔开,使下一个数据仍然放在偶数地址上。

x86 CPU有个EFLAGS寄存器,它有一个特殊的标志位,称为AC(alignment check),就是对齐标志。在默认的情况下,这个标志位在第一次给CPU通电时被清零,那么CPU会自动执行必要的操作来访问错位数据,但是,如果该标志被设为1,那么一旦程序试图访问错位数据,CPU就会触发INT 17H中断。因此,在这种CPU体系下,如果我们没有刻意改动过这个寄存器的标志位,则无论怎样放置数据,都不会引发错误,最多是执行效率降低一些而已。

需要强制对齐的是IA-64 CPU,这种CPU不能自动处理数据错位的错误,此时,才要告诉编译器强制执行对齐处理。在IA-64版本的Microsoft C/C++编译器中,支持一个叫__unaligned的特殊关键字,编程时使用这个关键字在指针上,那么编译器就会自动替这个指针的寻访动作设计为对齐指令。这个关键字在x86版本的Microsoft C/C++编译器中不支持,因为这种CPU的自动处理动作比软件模仿要快得多,没必要再额外做这种代码。

编译开关,各种编译器可能不同,但应该是类似unaligned这样的关键字的东西。

[ 本帖最后由 TonyDeng 于 2011-8-13 11:17 编辑 ]
收到的鲜花

授人以渔,不授人以鱼。
2011-08-13 11:15
快速回复:自认为基础很好的请进,反正我是不信我学好了helllo word!
数据加载中...
 
   



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

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