亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                OC底層原理(二).內(nèi)存分配與內(nèi)存對(duì)齊

                OC底層原理(二).內(nèi)存分配與內(nèi)存對(duì)齊

                內(nèi)存分配開(kāi)始

                在上一篇的流程圖中,我們看到最后的流程中,在_class_createInstanceFromZone,我們分為三步:

                • 1、size = cls->instanceSize(extraBytes);獲取對(duì)象需要分配的內(nèi)存大小
                • 2、obj = (id)calloc(1, size);如何申請(qǐng)內(nèi)存
                • 3、obj->initInstanceIsa(cls, hasCxxDtor);初始化isa

                這一篇我們來(lái)分析獲取需要分配的大小,以及具體如何分配內(nèi)存,也就是我們的第1步和第2步。

                分析instanceSize函數(shù)的實(shí)現(xiàn)

                size_t instanceSize(size_t extraBytes) const { if (fastpath(cache.hasFastInstanceSize(extraBytes))) { return cache.fastInstanceSize(extraBytes); } size_t size = alignedInstanceSize() + extraBytes; // CF requires all objects be at least 16 bytes. if (size < 16) size = 16; return size;}

                我們從alignedInstanceSize開(kāi)始看,這個(gè)方法中

                uint32_t alignedInstanceSize() const { return word_align(unalignedInstanceSize());}

                這個(gè)方法中的unalignedInstanceSize我們?cè)賮?lái)看看

                uint32_t unalignedInstanceSize() const { ASSERT(isRealized()); return data()->ro()->instanceSize;}

                我們來(lái)分析data()->ro()->instanceSize,data()實(shí)現(xiàn)為:

                class_rw_t *data() const { return bits.data();}

                class_ro_t是類在編譯器存儲(chǔ)類信息的數(shù)據(jù)結(jié)構(gòu),它里面包含了類的實(shí)例變量、方法列表、協(xié)議列表等,class_rw_t是用來(lái)存儲(chǔ) 在dyld的_map_images方法中將分類的各種信息與class_ro_t合并后的信息。

                data()->ro()->instanceSize也就是獲取對(duì)象所有實(shí)例變量需要的存儲(chǔ)大小。

                我們?cè)倏磜ord_align的實(shí)現(xiàn)

                # define WORD_MASK 7ULstatic inline uint32_t word_align(uint32_t x) { return (x + WORD_MASK) & ~WORD_MASK;}

                這個(gè)方法先將大小加上7,然后和~WORD_MASK進(jìn)行邏輯與,由于7的二進(jìn)制為0000 1111,對(duì)它取反后1111 0000,再與前面進(jìn)行與,那么我們的內(nèi)存分配的大小就是8的倍數(shù)了,也就是8字節(jié)對(duì)齊

                最后,if (size < 16) size = 16;這一步就是如果不足16字節(jié),那么我們就補(bǔ)足16,所以一個(gè)OC對(duì)象,至少是16個(gè)字節(jié)。

                整個(gè)步驟流程如下:

                instanceSize流程

                獲取內(nèi)存大小的三種方式

                我們?cè)贠C中獲取內(nèi)存大小的三種方式分別是:

                • sizeof操作符 獲取數(shù)據(jù)的類型占用空間的大小
                • class_getInstanceSize(Class _Nullable cls) 獲取實(shí)例對(duì)象中成員變量所需要占用的內(nèi)存大小
                • malloc_size(const void *ptr) 獲取系統(tǒng)實(shí)際分配的內(nèi)存大小

                我們創(chuàng)建一個(gè)LWTestClass來(lái)測(cè)試

                @interface LWTestClass : NSObject@property (nonatomic, copy) NSString *name;@property (nonatomic, copy) NSString *nickName;@property (nonatomic, assign) int age;@property (nonatomic, assign) long height;@endint main(int argc, const char * argv[]) { @autoreleasepool { LWTestClass *person = [LWTestClass alloc]; person.name = @”Cooci”; person.nickName = @”KC”; NSLog(@”%@ – %lu – %lu – %lu”,person,sizeof([LWTestClass class]),class_getInstanceSize([LWTestClass class]),malloc_size((__bridge const void *)(person))); } return 0;}打印結(jié)果: – 8 – 40 – 48

                如上面的結(jié)果

                • sizeof中是[LWTestClass class],它是一個(gè)指針,我們指針值是8,所以是8
                • class_getInstanceSize中獲取的是LWTestClass類的對(duì)象中實(shí)例變量所需的大小,我們來(lái)分析LWTestClass類結(jié)構(gòu),isa占8字節(jié),name8字節(jié),nickName8字節(jié),age4字節(jié)補(bǔ)齊到8字節(jié),height8字節(jié),所以LWTestClass類只用40字節(jié)就可以保證存儲(chǔ)了。
                • malloc_size顯示系統(tǒng)分配的內(nèi)存為48字節(jié),為什么是48字節(jié)呢?我們之前不是看到類的字節(jié)對(duì)齊不是8嗎?40也是8的倍數(shù),為什么不是分配40字節(jié)呢?

                為什么是48字節(jié)?

                我們?cè)陂_(kāi)篇中所說(shuō)的第一步是獲取對(duì)象所需空間大小,這里我們只能確定對(duì)象內(nèi)存的內(nèi)存布局是8字節(jié)對(duì)齊,這也是class_getInstanceSize獲取到的內(nèi)存大小,malloc_size獲取到的是系統(tǒng)分配的內(nèi)存大小,這是屬于我們第二步中obj = (id)calloc(1, size);的內(nèi)容,calloc方法的分析我們需要用libmalloc源碼,具體的調(diào)用順序我們不一一列舉,大致的調(diào)用過(guò)程如以下流程圖與核心代碼。

                calloc調(diào)用流程

                #define SHIFT_NANO_QUANTUM 4#define NANO_REGIME_QUANTA_SIZE (1 SHIFT_NANO_QUANTUM; // round up and shift for number of quanta //再左移4位,這樣得到的大小就是16的倍數(shù) //內(nèi)存分配也就是以16字節(jié)對(duì)齊了 slot_bytes = k << SHIFT_NANO_QUANTUM; // multiply by power of two quanta size *pKey = k – 1; // Zero-based! return slot_bytes;}

                所以,在前面的例子中,我們計(jì)算出對(duì)象所需的內(nèi)存字節(jié)大小為40,進(jìn)行16字節(jié)對(duì)齊后,我們實(shí)際分配的內(nèi)存大小為48.

                為什么系統(tǒng)分配內(nèi)存要以16字節(jié)對(duì)齊

                這個(gè)沒(méi)找到具體的答案,猜想如下:

                • 一個(gè)對(duì)象是一個(gè)struct objc_object的結(jié)構(gòu)體,它至少有一個(gè)成員變量isa,一個(gè)isa占的大小為8字節(jié)
                • 如果我們以8字節(jié)來(lái)分配,兩個(gè)連續(xù)的對(duì)象在內(nèi)存中就是連續(xù)存儲(chǔ)在一起的,如果我們以內(nèi)存偏移(offset)來(lái)訪問(wèn)的話,如果有一定的錯(cuò)誤,就會(huì)訪問(wèn)到另一個(gè)對(duì)象的isa中,這樣會(huì)造成一定的不安全性。

                這段有想法的大佬希望可以留言給予指導(dǎo)

                內(nèi)存對(duì)齊

                上面我們說(shuō)內(nèi)存對(duì)齊,那么內(nèi)存對(duì)齊有什么規(guī)則呢?為什么要內(nèi)存對(duì)齊呢?

                內(nèi)存對(duì)齊規(guī)則

                struct/class/union內(nèi)存對(duì)齊原則有四個(gè):

                • 1).數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個(gè)數(shù)據(jù)成員放在offset為0的地方,以后每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置要從該成員大小或者成員的子成員大?。ㄖ灰摮蓡T有子成員,比如說(shuō)是數(shù)組,結(jié)構(gòu)體等)的整數(shù)倍開(kāi)始(比如int在32位機(jī)為4字節(jié), 則要從4的整數(shù)倍地址開(kāi)始存儲(chǔ)),基本類型不包括struct/class/uinon。
                • 2).結(jié)構(gòu)體作為成員:如果一個(gè)結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從其內(nèi)部”最寬基本類型成員“的整數(shù)倍地址開(kāi)始存儲(chǔ).(struct a里存有struct b,b里有char,int ,double等元素,那b應(yīng)該從8的整數(shù)倍開(kāi)始存儲(chǔ).)。
                • 3).收尾工作:結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,.必須是其內(nèi)部最大成員的”最寬基本類型成員”的整數(shù)倍.不足的要補(bǔ)齊.(基本類型不包括struct/class/uinon)。
                • 4).sizeof(union),以結(jié)構(gòu)里面size最大元素為union的size,因?yàn)樵谀骋粫r(shí)刻,union只有一個(gè)成員真正存儲(chǔ)于該地址。

                內(nèi)存對(duì)齊實(shí)踐

                我們?cè)O(shè)置3個(gè)結(jié)構(gòu)體,并分別打印它們所占字節(jié)大小

                struct TestStruct1{ double a; int b; bool c; short d;}st1;struct TestStruct2{ int a; double b; bool c; short d;}st2;struct TestStruct3{ int a; double b; struct TestStruct1 st; bool c; short d;}st3;int main(int argc, const char * argv[]) { NSLog(@”st1:%lu,st2:%lu,st3:%lu”,sizeof(st1),sizeof(st2),sizeof(st3)); //打印結(jié)果:st1:16,st2:24,st3:40 return 0;}

                從結(jié)果可以看到,st1和st2結(jié)構(gòu)體中所含有的數(shù)據(jù)類型與個(gè)數(shù)相同,但位置不同,它們所占的大小也變得不一致了。

                下面我們來(lái)分析它們分別的內(nèi)存構(gòu)成:

                struct TestStruct1

                • a占8字節(jié),從0開(kāi)始,它排在內(nèi)存[0,7]的位置上
                • b占4字節(jié),從8開(kāi)始,8是4的倍數(shù),符合規(guī)則,所以b存在內(nèi)存[8,11]位置上
                • c占1字節(jié),從12開(kāi)始,12是1的倍數(shù),符合規(guī)則,所以c存在內(nèi)存12位置上
                • d占2字節(jié),從13開(kāi)始,但是13不是2的倍數(shù),所以往后到14的位置上,它是2的倍數(shù),所以d存在內(nèi)存[14,15]位置上
                • 所有成員變量排在[0,15]位置上,它的總大小為16,是最大成員變量double(8字節(jié))的倍數(shù),所以struct TestStruct1的總大小為16字節(jié)

                struct TestStruct2

                • a占4字節(jié),從0開(kāi)始,它排在內(nèi)存[0,3]的位置上
                • b占8字節(jié),從4開(kāi)始,但是4不是8的倍數(shù),所以往后順排到8開(kāi)始排,以b存在內(nèi)存[8,15]位置上
                • c占1字節(jié),從16開(kāi)始,16是1的倍數(shù),符合規(guī)則,所以c存在內(nèi)存16位置上
                • d占2字節(jié),從17開(kāi)始,但是17不是2的倍數(shù),所以往后到18的位置上,它是2的倍數(shù),所以d存在內(nèi)存[18,19]位置上
                • 所有成員變量排在[0,19]位置上,它的總大小為20,不是最大成員變量double(8字節(jié))的倍數(shù),我們?cè)诤竺嫜a(bǔ)0湊夠24變?yōu)?的倍數(shù),所以struct TestStruct2的總大小為24字節(jié)

                struct TestStruct3

                • a占4字節(jié),從0開(kāi)始,它排在內(nèi)存[0,3]的位置上
                • b占8字節(jié),從4開(kāi)始,但是4不是8的倍數(shù),所以往后順排到8開(kāi)始排,以b存在內(nèi)存[8,15]位置上
                • st是一個(gè)結(jié)構(gòu)體變量,它占16字節(jié),它內(nèi)部最大的成員變量所占字節(jié)數(shù)為8,st從16開(kāi)始,它是8的倍數(shù),符合規(guī)則,所以st排在內(nèi)存[16,31]的位置上
                • c占1字節(jié),從32開(kāi)始,32是1的倍數(shù),符合規(guī)則,所以c存在內(nèi)存32位置上
                • d占2字節(jié),從33開(kāi)始,但是33不是2的倍數(shù),所以往后到34的位置上,它是2的倍數(shù),所以d存在內(nèi)存[34,35]位置上
                • 所有成員變量排在[0,35]位置上,它的總大小為36,不是最大成員變量double和struct TestStruct1(8字節(jié))的倍數(shù),我們?cè)诤竺嫜a(bǔ)0湊夠40變?yōu)?的倍數(shù),所以struct TestStruct2的總大小為40字節(jié)

                三個(gè)結(jié)構(gòu)體的內(nèi)部布局如下圖

                結(jié)構(gòu)體內(nèi)存構(gòu)成

                為什么要內(nèi)存對(duì)齊

                回答這個(gè)問(wèn)題,我們要從內(nèi)存、CPU以及平臺(tái)三個(gè)方向來(lái)回答

                1.平臺(tái)

                移植原因:不是所有的硬件平臺(tái)都能訪問(wèn)任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。

                2.CPU原因

                • CPU位數(shù)就是CPU的數(shù)據(jù)總線寬度,而寬度決定了它的單次數(shù)據(jù)傳送量,比如我們現(xiàn)在iOS平臺(tái)一般都是64位,那么64位的CPU一次通電可以傳輸8個(gè)字節(jié)的數(shù)據(jù),那么我們8個(gè)字節(jié)倍數(shù)的內(nèi)存對(duì)齊,可以最大化的節(jié)省CPU傳輸?shù)拇螖?shù)。
                • 在CPU眼里,內(nèi)存是一塊一塊的,塊的大小可以是2、4、8、16字節(jié)大小,因此CPU在讀取內(nèi)存時(shí)是一塊一塊進(jìn)行讀取的,塊大小稱為memory access granulatity,我們將它翻譯為內(nèi)存讀取粒度。
                  • 假設(shè)CPU要讀取一個(gè)4字節(jié)的int類型數(shù)據(jù)到寄存器中,分兩種情況討論: 1)數(shù)據(jù)從0字節(jié)開(kāi)始 2)數(shù)據(jù)從1字節(jié)開(kāi)始
                  • 假設(shè)內(nèi)存讀取粒度為4
                  • 當(dāng)從0字節(jié)開(kāi)始時(shí),CPU只需要讀取一次即可把這4字節(jié)的數(shù)據(jù)完全讀取到寄存器中
                  • 當(dāng)該數(shù)據(jù)是從1字節(jié)開(kāi)始時(shí),問(wèn)題變得比較復(fù)雜,此時(shí)該int類型數(shù)據(jù)不是位于內(nèi)存讀取邊界上,那么CPU對(duì)它進(jìn)行讀取,要分為兩次讀取
                  • 此時(shí)CPU先訪問(wèn)一次內(nèi)存,讀取0-3字節(jié)的數(shù)據(jù)進(jìn)寄存器,并再次讀取4-5字節(jié)的數(shù)據(jù)進(jìn)寄存器,接著把0字節(jié)和6,7,8字節(jié)的數(shù)據(jù)剔除,最后合并1-4字節(jié)的數(shù)據(jù)進(jìn)寄存器。對(duì)一個(gè)內(nèi)存未對(duì)齊的數(shù)據(jù)進(jìn)行了這么多額外的操作,大大降低了CPU性能。
                  • 另外,由于平臺(tái)原因,有些CPU可能未到邊界即已報(bào)異常。

                3.內(nèi)存原因

                我們先講講內(nèi)存結(jié)構(gòu)

                • 內(nèi)存的物理構(gòu)造中,一個(gè)內(nèi)存是由若干個(gè)黑色內(nèi)存顆粒構(gòu)成的,每一個(gè)內(nèi)存顆粒叫做一個(gè)chip
                • 每一個(gè)chip內(nèi)部,是由8個(gè)bank組成的
                • 在每個(gè)bank內(nèi)部,就是電容的行列矩陣結(jié)構(gòu)。(注意,二維矩陣中的一個(gè)元素一般存儲(chǔ)著8個(gè)bit,也就是說(shuō)包含了8個(gè)小電容)
                • 8個(gè)同位置的元素,一起組成在內(nèi)存中連續(xù)的64個(gè)bit
                • 通過(guò)內(nèi)存的物理結(jié)構(gòu)我們可以看出,內(nèi)存中最小單位就是字節(jié),操作系統(tǒng)在管理它的時(shí)候,最小單位也就是字節(jié)。另外,通過(guò)上述的我們還有一個(gè)額外發(fā)現(xiàn)。那就是在內(nèi)存中連續(xù)的64個(gè)bit,其實(shí)在內(nèi)存的物理結(jié)構(gòu)中,并不連續(xù)。而是分散在同位置的8個(gè)rank上的。
                • 內(nèi)存在進(jìn)行的時(shí)候,一次操作取的就是64bit,所以內(nèi)存對(duì)齊最底層的原因是內(nèi)存的IO以64bit為單位進(jìn)行的。對(duì)于64位數(shù)據(jù)寬度的內(nèi)存,假如cpu也是64位的cpu(現(xiàn)在的計(jì)算機(jī)基本都是這樣的),每次內(nèi)存IO獲取數(shù)據(jù)都是從同行同列的8個(gè)chip中各自讀取一個(gè)字節(jié)拼起來(lái)的。從內(nèi)存的0地址開(kāi)始,0-63bit的數(shù)據(jù)可以一次IO讀取出來(lái),64-127bit的數(shù)據(jù)也可以一次讀取出來(lái)。CPU和內(nèi)存IO的硬件限制導(dǎo)致沒(méi)辦法一次跨在兩個(gè)數(shù)據(jù)寬度中間進(jìn)行IO。
                  • 假如對(duì)于一個(gè)c的程序員,如果把一個(gè)bigint(64位)地址寫(xiě)到的0x0001開(kāi)始,而不是0x0000開(kāi)始,那么數(shù)據(jù)并沒(méi)有存在同一行列地址上。因此cpu必須得讓內(nèi)存工作兩次才能取到完整的數(shù)據(jù)。效率自然就很低。
                  • 如果不強(qiáng)制對(duì)地址進(jìn)行操作,僅僅只是簡(jiǎn)單用c定義一個(gè)結(jié)構(gòu)體,編譯和鏈接器會(huì)自動(dòng)替開(kāi)發(fā)者對(duì)齊內(nèi)存的。盡量幫你保證一個(gè)變量不跨列尋址。
                  • 在內(nèi)存硬件層上,還有操作系統(tǒng)層。操作系統(tǒng)還管理了CPU的一級(jí)、二級(jí)、三級(jí)緩存。實(shí)際中不一定每次IO都從內(nèi)存出,如果你的數(shù)據(jù)局部性足夠好,那么很有可能只需要少量的內(nèi)存IO,大部分都是更為高效的高速緩存IO。但是高速緩存和內(nèi)存一樣,也是要考慮對(duì)齊的。

                作者:默默_David鏈接:https://www.jianshu.com/p/d285a33bf88f來(lái)源:簡(jiǎn)書(shū)著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年7月3日 15:09
                下一篇 2022年7月3日 15:10

                相關(guān)推薦

                • 筆記本最好配置(目前筆記本最好的配置)

                  本文主要講的是筆記本最好配置,以及和目前筆記本最好的配置相關(guān)的知識(shí),如果覺(jué)得本文對(duì)您有所幫助,不要忘了將本文分享給朋友。 筆記本電腦什么配置好? 01 CPU:這個(gè)主要取決于頻率和…

                  2022年11月26日
                • 存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)

                  今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…

                  2022年11月26日
                • 《光遇》11月25日紅石在哪里 11.25紅石位置

                  光遇11月25日的紅石出現(xiàn)在霞谷圓夢(mèng)村,許多小伙伴都還不知道它具體在哪,下面就讓小編來(lái)給大家介紹一下光遇11.25紅石的位置,感興趣的小伙伴快來(lái)看看吧。 光遇11.25紅石位置 1…

                  2022年11月25日
                • 《光遇》11月25日季節(jié)蠟燭在哪 11.25季節(jié)蠟燭位置2022

                  光遇季節(jié)蠟燭的位置每天都會(huì)變化,今天出現(xiàn)在了雨林地區(qū),下面小編就給大家?guī)?lái)了光遇11.25季節(jié)蠟燭位置分享,有需要的小伙伴不要錯(cuò)過(guò)哦。 光遇11.25季節(jié)蠟燭位置2022 今日季節(jié)…

                  2022年11月25日
                • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

                  CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊(cè),可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來(lái)定…

                  2022年11月25日
                • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

                  如今抖音這個(gè)短視頻的變現(xiàn)能力越來(lái)越突顯了,尤其是在平臺(tái)上開(kāi)通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來(lái)越多的普通人加入到其中了。不過(guò)直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

                  2022年11月24日
                • 《寶可夢(mèng)朱紫》樁子是什么?二級(jí)神封印樁位置一覽

                  寶可夢(mèng)朱紫中有一種叫做二級(jí)神封印樁的特殊收集道具,很多玩家不知道寶可夢(mèng)朱紫樁子是什么,下面就帶來(lái)寶可夢(mèng)朱紫二級(jí)神封印樁位置一覽,感興趣的小伙伴不要錯(cuò)過(guò),希望能幫助到大家。 二級(jí)神封…

                  2022年11月24日
                • 《寶可夢(mèng)朱紫》太晶水地龍捕捉位置一覽 太晶水地龍?jiān)谀睦锊蹲?

                  近日在貼吧看到有許多玩家在寶可夢(mèng)朱紫中遇到了《寶可夢(mèng)朱紫》太晶水地龍捕捉位置一覽的問(wèn)題,又不知道該怎么辦。今天在這里,小編為大家?guī)?lái)的就是這個(gè)問(wèn)題的解方案,只要你跟著小編的節(jié)奏來(lái),…

                  2022年11月24日
                • 園屬于什么結(jié)構(gòu)(園的結(jié)構(gòu)和部首)

                  園 yuán:全包圍結(jié)構(gòu),平穩(wěn)端正中稍帶左收右展。 外部“口” 體態(tài)端莊,稍抗肩,稍帶左輕右重。左豎起筆稍抖,豎身勿重,稍左斜,垂露收筆;第二筆橫折壓著左豎起筆,橫畫(huà)稍抗肩,不要重…

                  2022年11月24日
                • 明查|美國(guó)新冠后遺癥患者中有16%癥狀嚴(yán)重以致無(wú)法工作?

                  點(diǎn)擊進(jìn)入澎湃新聞全球事實(shí)核查平臺(tái) 速覽 – 網(wǎng)傳數(shù)據(jù)比例無(wú)權(quán)威信源佐證,該比例有可能是結(jié)合了美國(guó)疾病防控中心和布魯金斯學(xué)會(huì)的數(shù)據(jù)得出,但這兩個(gè)機(jī)構(gòu)的調(diào)研目的和樣本都不同…

                  2022年11月24日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息