精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux內核中常用的C語言技巧

系統 Linux
在GNU C語言中,如果知道a和b的類型,可以在宏里面定義一個變量,將a, b賦值給變量,然后再比較。

圖片

Linux內核采用的是GCC編譯器,GCC編譯器除了支持ANSI C,還支持GNU C。在Linux內核中,許多地方都使用了GNU C語言的擴展特性,如typeof、__attribute__、__aligned、__builtin_等,這些都是GNU C語言的特性。

typeof

下面是比較兩個數大小返回最大值的經典宏寫法:

#define

如果a傳入i++,b傳入j++,那么這個比較大小就會出錯。例如:

#define

int x = 1, y = 2;
printf("max=%d\n", max(x++, y++));
printf("x = %d, y = %d\n", x, y);

輸出結果:max=3,x=2,y=4。這是錯誤的結果,正常我們希望的是max(1,2),返回max=2。如何修改這個宏呢?

在GNU C語言中,如果知道a和b的類型,可以在宏里面定義一個變量,將a, b賦值給變量,然后再比較。例如:

#define max(a,b) ({   \
int _a = (a); \
int _b = (b); \
_a > _b ? _a : _b; })

如果不知道具體的數據類型,可以使用typeof類轉換宏,Linux內核中的例子:

#define max(a, b) ({        \
typeof(a) _a = (a); \
typeof(b) _b = (b); \
(void) (&_a == &_b); \
_a > _b ? _a : _b; })

typeof(a) _a = (a):定義一個a類型的變量_a,將a賦值給_a

typeof(b) _b = (b):定義一個b類型的變量_b,將b賦值給_b

(void) (&_a == &_b):判斷兩個數的類型是否相同,如果不相同,會拋出一個警告。因為a和b的類型不一樣,其指針類型也會不一樣,兩個不一樣的指針類型進行比較操作,會拋出一個編譯警告。

typeof用法舉例:

//typeof的參數可以是表達式或類型

//參數是類型
typeof(int *) a,b;//等價于:int *a,*b;

//參數是表達式
int foo();
typeof(foo()) var;//聲明了int類型的var變量,因為表達式foo()是int類型的。由于表達式不會被執行,所以不會調用foo函數。

零長數組

零長數組,又叫柔性數組。而它的作用主要就是為了滿足需要變長度的結構體,因此有時也習慣性地稱為變長數組。

用法:在一個結構體的最后, 申明一個長度為0的數組, 就可以使得這個結構體是可變長的。

對于編譯器來說, 此時長度為0的數組并不占用空間, 因為數組名本身不占空間, 它只是一個偏移量, 數組名這個符號本身代表了一個不可修改的地址常量

結構體中定義零長數組:

<mm/percpu.c>
struct pcpu_chunk {
struct list_head list;
unsigned long populated[]; /* 變長數組 */
};

數據結構最后一個元素被定義為零長度數組,不占結構體空間。這樣,我們可以根據對象大小動態地分配結構的大小。

struct line {
int length;
char contents[0];
};

struct line *thisline = malloc(sizeof(struct line) + this_length);
thisline->length = this_length;

如上例所示,struct line數據結構定義了一個int length變量和一個變長數組contents[0],這個struct line數據結構的大小只包含int類型的大小,不包含contents的大小,也就是**sizeof (struct line) = sizeof (int)**。

創建結構體對象時,可根據實際的需要指定這個可變長數組的長度,并分配相應的空間,如上述實例代碼分配了this_length 字節的內存,并且可以通過contents[index]來訪問第index個地址的數據。

case范圍

GNU C語言支持指定一個case的范圍作為一個標簽,如:

case low ...high:
case 'A' ...'Z':

這里low到high表示一個區間范圍,在ASCII字符代碼中也非常有用。下面是Linux內核中的代碼例子。

<arch/x86/platform/uv/tlb_uv.c>

static int local_atoi(const char *name){
int val = 0;
for (;; name++) {
switch (*name) {
case '0' ...'9':
val = 10*val+(*name-'0');
break;
default:
return val;
}
}
}

另外,還可以用整形數來表示范圍,但是這里需要注意在“...”兩邊有空格,否則編譯會出錯。

<drivers/usb/gadget/udc/at91_udc.c>

static int at91sam9261_udc_init(struct at91_udc *udc){
for (i = 0; i < NUM_ENDPOINTS; i++) {
ep = &udc->ep[i];
switch (i) {
case 0:
ep->maxpacket = 8;
break;
case 1 ... 3:
ep->maxpacket = 64;
break;
case 4 ... 5:
ep->maxpacket = 256;
break;
}
}
}

標號元素

GNU C語言可以通過指定索引或結構體成員名來初始化,不必按照原來的固定順序進行初始化。

結構體成員的初始化在 Linux 內核中經常使用,如在設備驅動中初始化file_operations數據結構:

<drivers/char/mem.c>
static const struct file_operations zero_fops = {
.llseek = zero_lseek,
.read = new_sync_read,
.write = write_zero,
.read_iter = read_iter_zero,
.aio_write = aio_write_zero,
.mmap = mmap_zero,
};

如上述代碼中的zero_fops的成員llseek初始化為zero_lseek函數,read成員初始化為new_sync_read函數,依次類推。當file_operations數據結構的定義發生變化時,這種初始化方法依然能保證已知元素的正確性,對于未初始化成員的值為0或者NULL。

可變參數宏

在GNU C語言中,宏可以接受可變數目的參數,主要用在輸出函數里。例如:

<include/linux/printk.h>
#define pr_debug(fmt, ...) \
dynamic_pr_debug(fmt, ##__VA_ARGS__)

“...”代表一個可以變化的參數表,“__VA_ARGS__”是編譯器保留字段,預處理時把參數傳遞給宏。當宏的調用展開時,實際參數就傳遞給dynamic_pr_debug函數了。

函數屬性

GNU C語言允許聲明函數屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute),以便編譯器進行特定方面的優化和更仔細的代碼檢查。特殊屬性語法格式為:

__attribute__ ((attribute-list))

attribute-list?的定義有很多,如noreturn?、format?以及const?等。此外,還可以定義一些和處理器體系結構相關的函數屬性,如ARM體系結構中可以定義interrupt?、isr等屬性。

下面是Linux內核中使用format屬性的一個例子。

<drivers/staging/lustru/include/linux/libcfs/>
int libcfs_debug_msg(struct libcfs_debug_msg_data *msgdata,const char *format1, ...)__attribute__ ((format (printf, 2, 3)));

libcfs_debug_msg()函數里聲明了一個format函數屬性,它會告訴編譯器按照printf的參數表的格式規則對該函數參數進行檢查。數字2表示第二個參數為格式化字符串,數字3表示參數“...”里的第一個參數在函數參數總數中排在第幾個。

noreturn屬性告訴編譯器,該函數從不返回值,這可以消除一些不必要的警告信息。例如以下函數,函數不會返回:

void __attribute__((noreturn)) die(void);

const 屬性會讓編譯器只調用該函數一次,以后再調用時只需要返回第一次結果即可,從而提高效率。

static inline u32 __attribute_const__ read_cpuid_cachetype(void){
return read_cpuid(CTR_EL0);
}

Linux還有一些其他的函數屬性,被定義在compiler-gcc.h文件中。

#define
#define
#define
#define
#define
#define
#define
#define

變量屬性和類型屬性

變量屬性可以對變量或結構體成員進行屬性設置。類型屬性常見的屬性有alignment?、packed?和sections等。

alignment屬性規定變量或者結構體成員的最小對齊格式,以字節為單位。

struct qib_user_info {
__u32 spu_userversion;
__u64 spu_base_info;
} __aligned(8);

在這個例子中,編譯器以8字節對齊的方式來分配qib_user_info這個數據結構。

packed屬性可以使變量或者結構體成員使用最小的對齊方式,對變量是以字節對齊,對域是以位對齊。

struct test{
char a;
int x[2] __attribute__ ((packed));
};

x成員使用了packed屬性,它會存儲在變量a后面,所以這個結構體一共占用9字節。

內建函數

內建函數以“_builtin_”作為函數名前綴。下面介紹Linux內核常用的一些內建函數。

__builtin_constant_p(x):判斷x是否在編譯時就可以被確定為常量。如果x為常量,該函數返回1,否則返回0。

__builtin_expect(exp, c):

#define __swab16(x)        \
(__builtin_constant_p((__u16)(x)) ? \
___constant_swab16(x) : \
__fswab16(x))__builtin_expect(exp, c)

__builtin_expect(exp, c):這里的意思是exp==c的概率很大,用來引導GCC編譯器進行條件分支預測。開發人員知道最可能執行哪個分支,并將最有可能執行的分支告訴編譯器,讓編譯器優化指令序列,使指令盡可能地順序執行,從而提高CPU預取指令的正確率。

Linux內核中經常見到likely()?和unlikely()?函數,本質也是__builtin_expect():

#define LIKELY(x) __builtin_expect(!!(x), 1) //x很可能為真
#define UNLIKELY(x) __builtin_expect(!!(x), 0) //x很可能為假

__builtin_prefetch(const void *addr, int rw, int locality):主動進行數據預取,在使用地址addr的值之前就把其值加載到cache中,減少讀取的延遲,從而提高性能。

該函數可以接受3個參數:

  • 第一個參數addr表示要預取數據的地址;
  • 第二個參數rw表示讀寫屬性,1表示可寫,0表示只讀;
  • 第三個參數locality?表示數據在cache中的時間局部性,其中0表示讀取完addr的之后不用保留在cache中,而1~3表示時間局部性逐漸增強。如下面的prefetch()?和prefetchw()函數的實現。
<include/linux/prefetch.h>
#define
#define

下面是使用prefetch()函數進行優化的一個例子。

<mm/page_alloc.c>
void __init __free_pages_bootmem(struct page *page, unsigned int order){
unsigned int nr_pages = 1 << order;
struct page *p = page;
unsigned int loop;
prefetchw(p);
for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
prefetchw(p + 1);
__ClearPageReserved(p);
set_page_count(p, 0);
}

}

在處理struct page數據之前,通過prefetchw()預取到cache中,從而提升性能。

asmlinkage

在標準C語言中,函數的形參在實際傳入參數時會涉及參數存放問題。

對于x86架構,函數參數和局部變量被一起分配到函數的局部堆棧里。x86中對asmlinkage的定義:

<arch/x86/include/asm/linkage.h>
#define

attribute((regparm(0))):告訴編譯器該函數不需要通過任何寄存器來傳遞參數,只通過堆棧來傳遞。

對于ARM?來說,函數參數的傳遞有一套ATPCS標準,即通過寄存器來傳遞。ARM中的R0~R4寄存器存放傳入參數,當參數超過5個時,多余的參數被存放在局部堆棧中。所以,ARM平臺沒有定義asmlinkage。

<include/linux/linkage.h>
#define
#define

UL

在Linux內核代碼中,我們經常會看到一些數字的定義使用了UL后綴修飾。

數字常量會被隱形定義為int類型,兩個int類型相加的結果可能會發生溢出。

因此使用UL強制把int?類型數據轉換為unsigned long?類型,這是為了保證運算過程不會因為int的位數不同而導致溢出。

1 :表示有符號整型數字1

UL:表示無符號長整型數字1

責任編輯:武曉燕 來源: 嵌入式Linux充電站
相關推薦

2011-04-19 13:07:27

LinuxC語言

2010-05-21 16:33:02

MySQL數據庫

2024-01-30 10:11:00

SpringBoot項目開發

2010-07-20 10:04:25

Linux內核編譯

2009-08-07 10:28:03

2022-08-27 10:53:15

C語言Linux內核

2022-02-11 16:01:14

C語言技巧命令

2010-03-24 19:09:43

Python語言

2023-12-14 17:24:20

Linux開源項目

2017-11-21 15:34:15

Linux 開發開源

2021-04-20 11:48:59

LinuxLinux內核C++

2023-03-30 08:00:56

MySQL日期函數

2021-11-26 09:41:50

繪圖工具軟件工具開發

2019-10-11 08:41:18

JavaMemcached數據庫

2023-02-28 09:47:42

2010-01-12 10:11:36

學習C++語言

2023-02-17 08:14:29

C語言C技巧內存

2022-08-26 09:02:57

代碼庫編程語言

2022-02-25 14:51:39

LinuxC語言Linux 內核

2024-02-23 10:00:27

Linux工具
點贊
收藏

51CTO技術棧公眾號

亚洲国产av一区| 97自拍视频| 免费网站在线高清观看| 伊人久久大香| 亚洲国产日韩在线一区模特| 久久久水蜜桃| 国产在成人精品线拍偷自揄拍| 欧美日本一区二区视频在线观看 | 奇米影视888狠狠狠777不卡| 视频一区欧美日韩| 欧美猛男性生活免费| 亚洲第一香蕉网| 视频一区中文字幕精品| 色欧美片视频在线观看在线视频| 少妇熟女一区二区| 男人天堂资源在线| 高清在线不卡av| 国产精品久久一| 日韩欧美一级视频| 欧美三级网页| 精品国产拍在线观看| 无码国产精品久久一区免费| 日韩漫画puputoon| 天天综合色天天综合| 特级西西444| 亚洲搞黄视频| 国产日韩欧美综合一区| 精品国产一区二区三区麻豆免费观看完整版 | 欧美日韩亚洲国产综合| 黄色一级片网址| 污视频网站免费观看| 日韩不卡一区二区| 91产国在线观看动作片喷水| 国产美女福利视频| 狠狠做六月爱婷婷综合aⅴ| 欧美白人最猛性xxxxx69交| 色婷婷成人在线| 成人看片网页| 欧美日韩亚洲视频| 精品中文字幕av| 免费毛片b在线观看| 亚洲综合在线第一页| 一区二区在线观| 国产视频三级在线观看播放| 成人精品在线视频观看| 成人欧美视频在线| a天堂在线观看视频| 国产又粗又猛又爽又黄91精品| 国产精品久久久久影院日本| 久久人人爽人人爽人人片av免费| 国产日产高清欧美一区二区三区| 高清欧美性猛交| 久久在线视频精品| 亚洲国产日本| 91国自产精品中文字幕亚洲| 国产香蕉视频在线| 亚洲综合国产| 国产精品扒开腿做| 超碰在线观看91| 免费欧美在线视频| 成人黄色av播放免费| 国产一区二区在线不卡| 国产乱子伦视频一区二区三区| 成人一区二区电影| 精品久久无码中文字幕| 成人永久免费视频| 久久精品人成| 理论在线观看| 中文字幕乱码亚洲精品一区| 欧美aaa在线观看| 中文字幕有码在线观看| 亚洲曰韩产成在线| 日韩av黄色网址| jvid一区二区三区| 欧美高清视频一二三区 | 99久久伊人| 欧美精品色综合| 乳色吐息在线观看| 欧美中文一区| 最好看的2019的中文字幕视频| 精品人妻中文无码av在线| 欧美国产美女| 久久人人爽人人爽人人片av高请| www.色国产| 韩国女主播成人在线观看| 国产98在线|日韩| 极品白浆推特女神在线观看 | 在线观看成人av电影| 宅男网站在线免费观看| 欧美日韩综合视频| 手机免费看av网站| 久久综合五月婷婷| 日韩一二三在线视频播| 黄色小视频在线免费看| 日韩激情一区二区| 成人免费在线一区二区三区| 免费在线国产| 亚洲综合自拍偷拍| 狠狠热免费视频| 911精品国产| 日韩中文字幕国产精品| 日本天堂在线视频| 国内外成人在线| 欧美精品亚洲| 欧美videossex另类| 欧美性猛交xxxxxx富婆| 一边摸一边做爽的视频17国产 | 自拍偷拍亚洲精品| 亚洲视频免费播放| 国产在线播放一区三区四| 欧美另类一区| 青草青在线视频| 欧美三级日本三级少妇99| 怡红院一区二区| 久久久久久久久久久久久久久久久久 | 丝袜美腿亚洲综合| 波多野结衣一区二区三区在线观看| 青青草在线播放| 亚洲成人久久影院| 久久精品亚洲天堂| 欧美色爱综合| 国产激情久久久久| 无码国产精品高潮久久99| 一区二区三区蜜桃| 手机免费av片| 色999国产精品| 国产成人在线一区二区| 天天综合在线视频| 亚洲国产成人av好男人在线观看| 香蕉视频999| 日韩欧美视频| 国产精品久久久久久久电影| 精品成人一区二区三区免费视频| 激情懂色av一区av二区av| av地址在线观看| 永久91嫩草亚洲精品人人| 国产中文日韩欧美| 在线国产91| 欧美日韩精品欧美日韩精品 | 亚洲欧美日韩国产中文在线| 国产免费又粗又猛又爽| 第一sis亚洲原创| 国产精品久久综合av爱欲tv| 二区在线观看| 欧美天堂一区二区三区| 欧美精品日韩在线| 另类小说视频一区二区| 夜夜爽www精品| 亚洲最大的免费视频网站| 色av吧综合网| 国产强被迫伦姧在线观看无码| 一区免费观看视频| 久久精品亚洲天堂| 欧美日韩精选| 国产在线欧美日韩| 中文字幕高清在线播放| 亚洲欧美日韩一区二区三区在线| 7799精品视频天天看| 国产午夜精品久久久久久免费视| 无码人妻丰满熟妇区五十路百度| 亚洲欧洲av| 国产精品久久久久久搜索| 国产三级电影在线| 欧美日韩国产综合一区二区 | 国产片在线观看| 欧美色视频在线| 男人的天堂久久久| 成人av在线影院| 成年人黄色片视频| 首页国产精品| 国产精品白丝jk白祙| 亚洲美女尤物影院| 中文字幕亚洲一区二区三区| 国产精品无码久久久久成人app| 夜夜嗨av一区二区三区中文字幕| 无码国产精品一区二区免费式直播 | 夜夜嗨av禁果av粉嫩avhd| 亚洲三级在线免费观看| 中文字幕在线观看91| 亚洲在线日韩| 性欧美精品一区二区三区在线播放 | av电影在线播放| 日日摸夜夜添夜夜添精品视频| 一区国产精品| 精品女人视频| 国产精品三级美女白浆呻吟| 亚洲男同gay网站| 亚洲视频自拍偷拍| 精品国产乱码久久久久久蜜臀网站| 午夜视频在线观看一区二区三区 | 免费a级片在线观看| 色婷婷精品久久二区二区蜜臀av| 国产麻豆视频在线观看| 97久久久精品综合88久久| 污污的视频免费| 国产午夜久久| 日韩精品一区二区三区电影| 天天做夜夜做人人爱精品| 91日韩在线播放| 亚洲校园激情春色| 欧美精品在线看| 国产中文在线观看| 精品国免费一区二区三区| 亚洲精品一区二三区| 亚洲国产你懂的| 日本一级片免费| 久久久久久亚洲综合影院红桃| 99中文字幕在线| 蜜臀av一级做a爰片久久| 国产视频一视频二| 欧美激情在线| 亚洲三区四区| 久久综合色占| 精品国产一区二区三区日日嗨| 99久久久成人国产精品| 国产成人aa精品一区在线播放| 青春草在线免费视频| 日韩视频在线观看免费| 国产日产精品久久久久久婷婷| 亚洲激情在线视频| 国产精品探花视频| 欧美日韩国产色站一区二区三区| 亚洲天堂日韩av| 一区二区三区中文免费| 视频国产一区二区| 国产蜜臀av在线一区二区三区| 800av在线播放| 国产69精品久久久久毛片 | 成年人视频免费| 狠狠躁夜夜躁人人爽天天天天97 | 91aaaa| 亚洲色图图片| 91在线视频免费| 色综合视频一区二区三区44| 国产精品福利久久久| 免费观看欧美大片| 2019国产精品自在线拍国产不卡| 精精国产xxxx视频在线中文版 | 欧美日韩在线观看免费| 亚洲欧洲av色图| 午夜国产福利一区二区| 亚洲丝袜制服诱惑| 来吧亚洲综合网| 亚洲欧洲精品一区二区三区| 成人欧美一区二区三区黑人一 | 国产资源在线一区| 思思久久精品视频| 国产精品综合二区| 国产精品欧美性爱| 成人免费视频免费观看| 最近日本中文字幕| 久久久久久久久久美女| 国产精品免费无码| 国产精品污www在线观看| 免费91在线观看| 亚洲视频在线观看三级| 欧美黑人猛猛猛| 亚洲五码中文字幕| 成人精品在线看| 都市激情亚洲色图| 日韩欧美国产另类| 欧美日韩高清一区二区不卡| 国产精品一区二区三区在线免费观看| 欧美高清激情brazzers| www.国产黄色| 日韩成人性视频| 国产精品秘入口| 久久天堂av综合合色| 丁香影院在线| 国产成+人+综合+亚洲欧洲| 福利一区二区| 99电影在线观看| 牲欧美videos精品| 亚洲国产一区二区在线 | 极品美女扒开粉嫩小泬| 葵司免费一区二区三区四区五区| 一本岛在线视频| 国产91高潮流白浆在线麻豆| 91成人破解版| 亚洲免费观看在线观看| 91国产丝袜播放在线| 欧美少妇一区二区| 丰满岳乱妇国产精品一区| 精品网站999www| 91cn在线观看| 国产99视频在线观看| 91精品国产自产观看在线| 国产日韩欧美亚洲一区| av在线不卡顿| 亚洲精品蜜桃久久久久久| 日韩电影一二三区| 亚洲性图第一页| 日本一区二区成人| 欧美一级高潮片| 欧美日韩一区二区三区高清| 黄色av小说在线观看| 一个色综合导航| 黑人玩欧美人三根一起进| 国产精品狼人色视频一区| 极品束缚调教一区二区网站| 伊人av成人| 亚洲制服av| 国产国语老龄妇女a片| 中文在线免费一区三区高中清不卡| 国产精选第一页| 7777精品久久久大香线蕉| 欧美色18zzzzxxxxx| 欧美极品少妇xxxxx| 亚洲伦理一区二区| 欧美一二三区| 国产一区白浆| 国产精品91av| 亚洲人成网站色在线观看| 一级做a爰片久久毛片| 亚洲国产精品人人爽夜夜爽| 日本免费中文字幕在线| 日韩男女性生活视频| 久久视频在线观看| 国产性生活免费视频| 精品在线一区二区| 天天干天天舔天天操| 日韩欧美999| 理论片中文字幕| 欧美日本亚洲视频| 国产亚洲字幕| 自拍另类欧美| 美女视频黄久久| 久久久精品成人| 在线免费观看日本欧美| 三级无遮挡在线观看| 97久久伊人激情网| 国产成人av毛片| www.日本三级| 国产精品资源在线| 欧美日韩中文字幕在线观看| 5月丁香婷婷综合| 久cao在线| 成人黄色免费看| 香蕉综合视频| 国内av一区二区| 自拍偷拍亚洲欧美日韩| 99久久国产免费| 理论片在线不卡免费观看| 精品视频在线一区| 欧美少妇一区二区三区| 国产精品影视在线观看| 国产大学生自拍| 精品国产成人在线影院| 激情国产在线| 久久久影院一区二区三区| 久久国产日韩| 毛片视频免费播放| 91精品啪在线观看国产60岁| 成人ww免费完整版在线观看| 99视频免费观看| 亚洲每日更新| 91成年人网站| 欧美三级日韩在线| 天堂av最新在线| 国产视频一区二区不卡| 久久国产直播| 久久国产高清视频| 日韩视频国产视频| 操人在线观看| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 青青操在线播放| 欧美精品日韩精品| 欧美大片黄色| 美女被啪啪一区二区| 日本成人在线视频网站| 五月天av网站| 日韩国产精品一区| 成人精品高清在线视频| 午夜久久久久久久久久久| proumb性欧美在线观看| 亚洲国产av一区二区三区| 久久伊人精品一区二区三区| 欧美日韩麻豆| 国产精品自在自线| 精品久久久久久电影| 91这里只有精品| 国内精品二区| 麻豆一区二区在线| 日韩黄色三级视频| 搡老女人一区二区三区视频tv| av自拍一区| 久久这里只精品| 性做久久久久久| 日本中文字幕在线观看| 国产视频在线观看一区| 九色|91porny| 亚洲熟女综合色一区二区三区| 色香阁99久久精品久久久| 极品束缚调教一区二区网站| 色一情一区二区三区| 精品日韩视频在线观看| 最新日本在线观看| 日本精品一区二区三区不卡无字幕| 国产成人av影院| 羞羞色院91蜜桃|