日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

织梦dedecms响应式精密机械模具公司网站模板(自适应手机移动端)

發(fā)布時(shí)間:2024/3/12 HTML 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 织梦dedecms响应式精密机械模具公司网站模板(自适应手机移动端) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

模板介紹:
織夢(mèng)最新內(nèi)核開發(fā)的模板,該模板屬于企業(yè)通用、精密儀器、模具類企業(yè)都可使用,
這款模板使用范圍極廣,不僅僅局限于一類型的企業(yè),你只需要把圖片和產(chǎn)品內(nèi)容;
換成你的,顏色都可以修改,改完讓你耳目一新的感覺!
自帶最新的手機(jī)移動(dòng)端,同一個(gè)后臺(tái),數(shù)據(jù)即時(shí)同步,簡單適用!
原創(chuàng)設(shè)計(jì)、手工書寫DIV+CSS,
完美兼容IE7+、Firefox、Chrome、360瀏覽器等;主流瀏覽器;
頁面簡潔簡單,容易管理,DEDE內(nèi)核都可以使用;附帶測(cè)試數(shù)據(jù)!

模板特點(diǎn):
1.一款利于SEO的模板,手工CSS+DIV,圖片ALT,H系列標(biāo)簽已合理運(yùn)用。
2.同步手機(jī)站功能,手機(jī)站很強(qiáng)大。

模板頁面:
index.htm 首頁模板
head.htm
footer.htm
article_article.htm 文章內(nèi)容
這里不一一列出!

溫馨提示:
按照正常的織夢(mèng)安裝步驟來安裝還原就可以用了,從后臺(tái)重新點(diǎn)擊保存下系統(tǒng)基本參數(shù)。 系統(tǒng)>系統(tǒng)基本參數(shù)> 保存(確定)。

文件:n459.com/file/25127180-477760207

以下內(nèi)容無關(guān):

-------------------------------------------分割線---------------------------------------------

Redis 設(shè)計(jì)與實(shí)現(xiàn) 3:字符串 SDS
在 Redis 中,字符串都用自定義的結(jié)構(gòu)簡單動(dòng)態(tài)字符串(Simple Dynamic Strings,SDS)。
Redis 中使用到的字符串都是用 SDS,例如 key、string 類型的值、sorted set 的 member、hash 的 field 等等等等。。。

數(shù)據(jù)結(jié)構(gòu)
舊版本的結(jié)構(gòu)
在 3.2 版本之前,sds 的定義是這樣的:

struct sdshdr {
// buf 數(shù)組中已使用的字節(jié)數(shù)量,也就是 sds 本身的字符串長度
unsigned int len;
// buf 數(shù)組中未使用的字節(jié)數(shù)量
unsigned int free;
// 字節(jié)數(shù)組,用于保存字符串
char buf[];
};
舊版本 SDS 結(jié)構(gòu)示例

這樣的結(jié)構(gòu)有幾個(gè)好處:

單獨(dú)記錄長度len,獲取字符串長度的時(shí)間復(fù)雜度是 O(1) 。傳統(tǒng)的 C 字符串獲取長度需要遍歷字符串,直到遇到\0,時(shí)間復(fù)雜度是 O(N)。
buf 數(shù)組末尾遵循 C 字符串以 \0 結(jié)尾的慣例,可以兼容 C 處理字符串的函數(shù)。
減少修改字符串帶來的內(nèi)存重分配次數(shù),Redis 使用了 空間預(yù)分配(預(yù)先申請(qǐng)大一點(diǎn)點(diǎn)的空間) 和 空間惰性釋放(字符串變短修改len字段即可)來減少字符串修改引起的內(nèi)存重新分配。
不以\0為結(jié)尾的判斷,二進(jìn)制安全。因?yàn)閳D片等二進(jìn)制數(shù)據(jù)中,可能包含\0,傳統(tǒng) C 字符串一遇到 \0 就認(rèn)為字符串結(jié)束了,會(huì)導(dǎo)致不能完整保存。
缺點(diǎn):

len 和 free 的定義用了 4 個(gè)字節(jié),可以表示 2^32 的長度。但是我們實(shí)際使用的字符串,往往沒有那么長。4 個(gè)字節(jié)造成了浪費(fèi)。
新版本的結(jié)構(gòu)
舊版本中我們說到,len 和 free 的缺點(diǎn)是用了太長的變量,新版本解決了這個(gè)問題。
我們來看一下新版本的 SDS 結(jié)構(gòu)。

在 Redis 3.2 版本之后,Redis 將 SDS 劃分為 5 種類型:

類型 字節(jié) 位
sdshdr5 < 1 <8
sdshdr8 1 8
sdshdr16 2 16
sdshdr32 4 32
sdshdr64 8 64
新版本新增加了一個(gè) flags 字段來標(biāo)識(shí)類型,長度 1 字節(jié)(8 位)。
類型只占用了前 3 位。在 sdshdr5 中,后 5 位用來保存字符串的長度。其他類型后 5 位沒有用。

struct attribute ((packed)) sdshdr5 {
unsigned char flags; /* 前 3 位保存類型,后 5 位保存字符串長度 /
char buf[];
};
struct attribute ((packed)) sdshdr8 {
uint8_t len; / 字符串長度,1 字節(jié) 8 位 /
uint8_t alloc; / 申請(qǐng)的總長度,1 字節(jié) 8 位 /
unsigned char flags; / 前 3 位保存類型,后 5 位未使用 /
char buf[];
};
struct attribute ((packed)) sdshdr16 {
uint16_t len; / 字符串長度,2 字節(jié) 16 位 /
uint16_t alloc; / 申請(qǐng)的總長度,2 字節(jié) 16 位 /
unsigned char flags; / 前 3 位保存類型,后 5 位未使用 /
char buf[];
};
struct attribute ((packed)) sdshdr32 {
uint32_t len; / 字符串長度,4 字節(jié) 32 位 /
uint32_t alloc; / 申請(qǐng)的總長度,4 字節(jié) 32 位 /
unsigned char flags; / 前 3 位保存類型,后 5 位未使用 /
char buf[];
};
struct attribute ((packed)) sdshdr64 {
uint64_t len; / 字符串長度,8 字節(jié) 64 位 /
uint64_t alloc; / 申請(qǐng)的總長度,8 字節(jié) 64 位 /
unsigned char flags; / 前 3 位保存類型,后 5 位未使用 */
char buf[];
};
舊版本 SDS 結(jié)構(gòu)示例

優(yōu)點(diǎn):

舊版本相對(duì)于傳統(tǒng) C 字符串的優(yōu)點(diǎn),新版本都有
相對(duì)于舊版本,新版本可以通過字符串的長度,選擇不同的結(jié)構(gòu),可以節(jié)約內(nèi)存
使用 attribute ((packed)) ,讓編譯器取消結(jié)構(gòu)在編譯過程中的優(yōu)化對(duì)齊,按照實(shí)際占用字節(jié)數(shù)進(jìn)行對(duì)齊,可以節(jié)約內(nèi)存
SDS 的初始化
sds 的定義,跟傳統(tǒng)的C語言字符串保持類型兼容 char *。但是 sds 是二進(jìn)制安全的,中間可能包含\0。

sds.h

typedef char *sds;
sds.c

// 初始化 sds
sds sdsnewlen(const void *init, size_t initlen) {
// 指向 sdshdr 開始地方的指針
void *sh;
// sds 實(shí)際是一個(gè)指針,指向 buf 開始的位置
sds s;
// 根據(jù)初始化的長度,返回 sds 的類型
char type = sdsReqType(initlen);
// initlen == 0,是空字符串,空字符串往往就是用來往后添加字節(jié)的,使用 SDS_TYPE_8 比 SDS_TYPE_5 更好
if (type == SDS_TYPE_5 && initlen == 0) type = SDS_TYPE_8;
// 根據(jù)類型獲取 struct sdshdr 的長度
int hdrlen = sdsHdrSize(type);
// flags 字段的指針
unsigned char *fp;

// 開始分配空間,+1 是為了最后一個(gè)的結(jié)束符號(hào) \0 sh = s_malloc(hdrlen+initlen+1); if (sh == NULL) return NULL; // const char *SDS_NOINIT = "SDS_NOINIT"; if (init==SDS_NOINIT)init = NULL; else if (!init)// 不是 init 則清空 sh 的內(nèi)存memset(sh, 0, hdrlen+initlen+1); // s 指向了 buf 開始的地址 // 從上面結(jié)構(gòu)可以看出,內(nèi)存地址的順序: len, alloc, flag, buf // 因?yàn)?buf 本身不占用空間,hdrlen 實(shí)際上就是結(jié)構(gòu)的頭(len、alloc、flags) s = (char*)sh+hdrlen; // flags 占用 1 個(gè)字節(jié),所以 s 退一位就是 flags 的開始位置了 fp = ((unsigned char*)s)-1; switch(type) {case SDS_TYPE_5: {// #define SDS_TYPE_BITS 3// 前 3 位保存類型,后 5 位保存長度*fp = type | (initlen << SDS_TYPE_BITS);break;}case SDS_TYPE_8: {// define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (void*)((s)-(sizeof(struct sdshdr##T)));// sh 變量賦值了 struct sdshdrSDS_HDR_VAR(8,s);sh->len = initlen;sh->alloc = initlen;*fp = type;break;}// 下面是對(duì) SDS_TYPE_16、SDS_TYPE_32、SDS_TYPE_64 的初始化,跟 SDS_TYPE_8 的類似,篇幅有限,省略... } // 如果 init 非空,則把 init 字符串賦值給 s,實(shí)際上也是 buf 的初始化 if (initlen && init)memcpy(s, init, initlen); // 最后加一個(gè)結(jié)束標(biāo)志 \0 s[initlen] = '\0'; return s;

}
SDS 的擴(kuò)/縮容
擴(kuò)容
擴(kuò)容就不跟初始化一樣寫注釋寫得那么詳細(xì)了,直接拉最重要的幾句代碼就行。

sds sdsMakeRoomFor(sds s, size_t addlen) {
// #define SDS_MAX_PREALLOC (1024*1024)
// 當(dāng)新的長度小于 1M 的時(shí)候,長度會(huì)增長一倍
// 當(dāng)新的長度達(dá)到 1M 之后,最多就增長 1M 了
if (newlen < SDS_MAX_PREALLOC)
newlen *= 2;
else
newlen += SDS_MAX_PREALLOC;
// …
}
縮容
sds 縮短不會(huì)真正縮小 buf,而是只改長度而已,類型也不變。

sds.c

// 刪掉字符串的左右字符中指定的字符
sds sdstrim(sds s, const char *cset) {
char *start, *end, *sp, *ep;
size_t len;

sp = start = s; ep = end = s+sdslen(s)-1; while(sp <= end && strchr(cset, *sp)) sp++; while(ep > sp && strchr(cset, *ep)) ep--; len = (sp > ep) ? 0 : ((ep-sp)+1); if (s != sp) memmove(s, sp, len);// 結(jié)尾符 s[len] = '\0'; // 縮短長度 sdssetlen(s,len); return s;

}
sds.h

static inline void sdssetlen(sds s, size_t newlen) {
// 設(shè)置sds長度,只是修改 sdshdr 結(jié)構(gòu)中的長度字段,類型不會(huì)變
unsigned char flags = s[-1];
switch(flags&SDS_TYPE_MASK) {
case SDS_TYPE_5:
{
unsigned char fp = ((unsigned char)s)-1;
*fp = (unsigned char)(SDS_TYPE_5 | (newlen << SDS_TYPE_BITS));
}
break;
case SDS_TYPE_8:
SDS_HDR(8,s)->len = (uint8_t)newlen;
break;
case SDS_TYPE_16:
SDS_HDR(16,s)->len = (uint16_t)newlen;
break;
case SDS_TYPE_32:
SDS_HDR(32,s)->len = (uint32_t)newlen;
break;
case SDS_TYPE_64:
SDS_HDR(64,s)->len = (uint64_t)newlen;
break;
}
}

總結(jié)

以上是生活随笔為你收集整理的织梦dedecms响应式精密机械模具公司网站模板(自适应手机移动端)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。