亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2998 | 回復(fù): 9
打印 上一主題 下一主題

內(nèi)存對(duì)齊的概念. [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2003-07-09 12:32 |只看該作者 |倒序?yàn)g覽
內(nèi)存對(duì)齊比較精確的定義:一個(gè)數(shù)據(jù)類型只允許存放在該數(shù)據(jù)類型整數(shù)倍的內(nèi)存位置上;內(nèi)存對(duì)齊通常是一些硬件系統(tǒng)的硬性要求;

          例子:
#include <stdio.h>;

int main(void)
{
        char    *str = NULL;
        short int       *test1 = NULL;
        int             *test2 = NULL;

        str = (char *)malloc(100);
        if(str == NULL){
                printf("malloc error\n";
                exit(1);
        }

        printf("the str addr is %x\n", str);
        printf("the str+2 addr is %x\n", str+2);

        test1 = (short int *)(str + 2);
        *test1 = 1;

        printf("step1 pass\n";

        test2 = (int *)(str + 2);
        *test2 = 1;

        printf("step2 pass\n";

        return  0;
}

在sparc上運(yùn)行結(jié)果為:
the str addr is 20ca0
the str+2 addr is 20ca2
step1 pass
總線錯(cuò)誤 (core dumped)

而在intel上運(yùn)行沒(méi)有任何問(wèn)題;

上述程序,*test1是short int型,長(zhǎng)度是2字節(jié),它所放的內(nèi)存位置str+2是2的整數(shù)倍,沒(méi)問(wèn)題;而*test2是int型,長(zhǎng)度是4字節(jié),它所放的內(nèi)存位置str+2不是4的整數(shù)倍,因此會(huì)總線錯(cuò)誤 (core dumped)

因此可以看出,在sparc上有內(nèi)存對(duì)齊的要求,大家編程時(shí)要注意這一點(diǎn)!

不對(duì)請(qǐng)更正!

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2003-07-09 17:14 |只看該作者

內(nèi)存對(duì)齊的概念.

我覺(jué)得這樣理解可能不正確

因?yàn)閷?duì)齊只是編譯器為了內(nèi)存訪問(wèn)性能更高所做的優(yōu)化
另外你也可以選擇不對(duì)齊
有對(duì)應(yīng)編譯選項(xiàng)

可以看頂上FAQ查找pcak說(shuō)明

在網(wǎng)絡(luò)包中pack(1)更是重要
因?yàn)椴煌腃PU體系結(jié)構(gòu)不一樣

另外每個(gè)平臺(tái)編譯器優(yōu)化對(duì)齊數(shù)也不一樣
所以在這種時(shí)候一般會(huì)使用pack(1)對(duì)齊

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2003-07-10 08:29 |只看該作者

內(nèi)存對(duì)齊的概念.

樓上,不知道你在sparc上運(yùn)行過(guò)上述程序沒(méi)有,保證你出core;

另外,編譯器對(duì)齊確實(shí)可以提供內(nèi)存訪問(wèn)速度,但是這里的編譯器對(duì)齊只是針對(duì)struct,而對(duì)于c語(yǔ)言里的原始類型,如 int,short int等必須放在該數(shù)據(jù)類型整數(shù)倍的位置上,如果不這樣做,你的程序就會(huì)core掉;

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2003-07-10 09:50 |只看該作者

內(nèi)存對(duì)齊的概念.

某些RISC對(duì)此有硬性要求,不只是數(shù)據(jù),指令代碼都要求。對(duì)CISC以及其他RISC,大多是為了提升性能。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2003-07-10 12:16 |只看該作者

內(nèi)存對(duì)齊的概念.

那如果一個(gè)struct

struct{
char a;
int b;
char c;
int d;
}
使用pack(1)后訪問(wèn)的話呢  
使用pack(1)后它們都是連接保存的

我沒(méi)有solaris條件

但是在網(wǎng)絡(luò)包中對(duì)結(jié)構(gòu)都使用pack(1) 收發(fā)
所以覺(jué)得這不是問(wèn)題

同樣那個(gè)程序也沒(méi)有辦法測(cè)試
如果有條件的話可以知道是什么問(wèn)題的

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2003-07-10 13:57 |只看該作者

內(nèi)存對(duì)齊的概念.

在某些系統(tǒng)上,如sparc,你的結(jié)構(gòu)在訪問(wèn)int b時(shí)可能就會(huì)core。不過(guò)這個(gè)問(wèn)題也與編譯器的處理有關(guān),有些編譯器會(huì)對(duì)非對(duì)齊的數(shù)據(jù)特殊處理,保證不產(chǎn)生core。
至于網(wǎng)絡(luò)包發(fā)送,因?yàn)槊鎸?duì)的都是字節(jié),沒(méi)有對(duì)結(jié)構(gòu)成員的訪問(wèn),所以不存在問(wèn)題。此外,結(jié)構(gòu)直接傳送是不鼓勵(lì)的,會(huì)有不兼容的問(wèn)題出現(xiàn),包括字長(zhǎng)、字節(jié)序等,即使你用了pack(1)也是不行的。所以,在網(wǎng)絡(luò)編程時(shí)沒(méi)有必要用pack(1)。
習(xí)慣了C編程的程序員總是希望不用進(jìn)行編解碼就可以很好地進(jìn)行網(wǎng)絡(luò)通信,其實(shí)完全是不對(duì)的。不要對(duì)對(duì)端做太多假設(shè),這樣你的應(yīng)用才有更好的可移植性。相對(duì)與網(wǎng)絡(luò)傳輸?shù)男阅芏,編解碼的開銷根本不算什么。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2003-07-10 14:08 |只看該作者

內(nèi)存對(duì)齊的概念.

原帖由 "無(wú)雙" 發(fā)表:
那如果一個(gè)struct

struct{
char a;
int b;
char c;
int d;
}
使用pack(1)后訪問(wèn)的話呢  
使用pack(1)后它們都是連接保存的

我沒(méi)有solaris條件

但是在網(wǎng)絡(luò)包中對(duì)結(jié)構(gòu)都使用pack(1) 收發(fā)
所以覺(jué)得這?.........
   

無(wú)雙,你知道你的這個(gè)結(jié)構(gòu)體在用pack(1)后,在訪問(wèn)結(jié)構(gòu)體成員b時(shí),它是要訪問(wèn)兩次的,然后把這兩次訪問(wèn)的結(jié)果和并起來(lái),這樣才是b成員的數(shù)據(jù);

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2003-07-10 14:18 |只看該作者

內(nèi)存對(duì)齊的概念.

原帖由 "fieryfox" 發(fā)表:
在某些系統(tǒng)上,如sparc,你的結(jié)構(gòu)在訪問(wèn)int b時(shí)可能就會(huì)core。不過(guò)這個(gè)問(wèn)題也與編譯器的處理有關(guān),有些編譯器會(huì)對(duì)非對(duì)齊的數(shù)據(jù)特殊處理,保證不產(chǎn)生core。
至于網(wǎng)絡(luò)包發(fā)送,因?yàn)槊鎸?duì)的都是字節(jié),沒(méi)有對(duì)結(jié)構(gòu)成員的訪..........
   


對(duì)齊的原因不是節(jié)省帶寬
我想在這點(diǎn)上你是理解錯(cuò)了

有的系統(tǒng)對(duì)結(jié)構(gòu)使用不同的對(duì)齊方式如8字節(jié)對(duì)齊 并且還有大印第安小印弟安區(qū)別

所以如果在不同操作系統(tǒng)上發(fā)送的包
那么其它系統(tǒng)會(huì)不能理解你包的內(nèi)容
因此需要對(duì)1位對(duì)齊

這點(diǎn)可以看頂上FAQ中討論 里面有solaris linux windows平臺(tái)上各編譯器選項(xiàng)的討論

還有就是傳送的時(shí)間不訪問(wèn)
但收到的一方是訪問(wèn)的
直接訪問(wèn)那個(gè)結(jié)構(gòu) 直接按1字節(jié)對(duì)齊的方式訪問(wèn)
所以在多數(shù)網(wǎng)絡(luò)操作系統(tǒng)中 沒(méi)有限制某個(gè)變量一定要從哪里開始保存
只是性能上有差異

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2003-07-10 15:28 |只看該作者

內(nèi)存對(duì)齊的概念.

你的這些問(wèn)題我前面的帖子里都說(shuō)了,而且強(qiáng)調(diào)了即使pack(1)在異構(gòu)網(wǎng)絡(luò)環(huán)境中也是有問(wèn)題的。我說(shuō)編解碼的開銷相比網(wǎng)絡(luò)傳輸?shù)男阅芨静凰闶裁,并不是說(shuō)帶寬的問(wèn)題,而是指你的應(yīng)用的性能問(wèn)題(增加編解碼功能對(duì)網(wǎng)絡(luò)應(yīng)用的影響很小)。像你說(shuō)的“大印第安小印弟安區(qū)別”(我的帖子里說(shuō)的是字節(jié)序。目前的硬件體系還沒(méi)有位序問(wèn)題,這也是值得慶幸的),直接的結(jié)構(gòu)傳送是無(wú)法避免的,所以不能用結(jié)構(gòu)傳送,即使是pack(1)。
所以,系統(tǒng)的對(duì)齊方式對(duì)網(wǎng)絡(luò)通信本來(lái)是不該有影響的,重要的仍然是字長(zhǎng)、字節(jié)序這些問(wèn)題。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2003-07-10 19:14 |只看該作者

內(nèi)存對(duì)齊的概念.

老大
那你先開發(fā)一個(gè)linux和windows通信的網(wǎng)絡(luò)程序后再說(shuō)

做和solaris的更好
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP