真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++類(lèi)型萃?。ǚ治募芾恚?創(chuàng)新互聯(lián)

C++類(lèi)型萃取(分文件管理)類(lèi)型萃取
類(lèi)型萃取是基于c++中的模板特化來(lái)實(shí)現(xiàn)的,是對(duì)于模板特化的應(yīng)用。

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供蘇家屯企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為蘇家屯眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

以通用的拷貝函數(shù)為例

拷貝函數(shù),c++自帶的拷貝函數(shù)是俗稱(chēng)的淺拷貝,淺拷貝對(duì)于一些內(nèi)置類(lèi)型而言不會(huì)出錯(cuò),但對(duì)于一些自定義類(lèi)型在拷貝的時(shí)候就會(huì)出現(xiàn)內(nèi)存訪問(wèn)錯(cuò)誤(中斷),想回顧淺拷貝的“同志”可以看https://blog.51cto.com/14233078/2442527
C++類(lèi)型萃?。ǚ治募芾恚?>1.此方案雖然解決了拷貝問(wèn)題,但是缺點(diǎn)也很明顯,在每一次拷貝數(shù)據(jù),都需要遍歷一遍,時(shí)間復(fù)雜度O(1)</p><pre><code>#include<iostream>
using namespace std;
#include<string>

template<class T>
void Copy1(T* dst, T* src, size_t size)
{
    memcpy(dst, src, sizeof(T)*size);
}

// 優(yōu)點(diǎn):一定不會(huì)出錯(cuò)
// 缺陷:O(N)
template<class T>
void Copy2(T* dst, T* src, size_t size)
{
    for (size_t i = 0; i < size; ++i)
        dst[i] = src[i];
}

bool IsPODType(const char* strType)
{
    // 此處可以將所有的內(nèi)置類(lèi)型枚舉出來(lái)
    const char* strTypes[] = { void Copy(T* dst, T* src, size_t size) { // 通過(guò)typeid可以將T的實(shí)際類(lèi)型按照字符串的方式返回 if (IsPODType(typeid(T).name())) { // T的類(lèi)型:內(nèi)置類(lèi)型 memcpy(dst, src, sizeof(T)*size); } else { // T的類(lèi)型:自定義類(lèi)型---原因:自定義類(lèi)型中可能會(huì)存在淺拷貝 for (size_t i = 0; i < size; ++i) dst[i] = src[i]; } } void TestCopy() { int array1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; int array2[10]; Copy(array2, array1, 10); string s1[3] = { "1111", "2222", "3333" }; string s2[3]; Copy(s2, s1, 3); } int main() { TestCopy(); return 0; }

C語(yǔ)言參與編譯的是.c文件,一個(gè).c文件是一個(gè)編譯單元。
頭文件在預(yù)處理階段被展開(kāi),即,預(yù)處理器看見(jiàn)#include預(yù)處理指令的時(shí)候,就用相應(yīng)頭文件的內(nèi)容替換掉這個(gè)#include預(yù)處理指令(把頭文件內(nèi)容拷貝到.c文件中,然后刪除這條#include預(yù)處理指令)。
你應(yīng)該把頭文件看出是導(dǎo)出給外部模塊使用的接口,里面存放外部模塊需要使用的宏定義及函數(shù)原型。
在linux下,可以用gcc -E查看預(yù)處理之后的文件。
頭文件中的函數(shù)原型是提供給編譯器作為函數(shù)原型檢查的,對(duì)于不是本源文件中的函數(shù),編譯過(guò)程中并不會(huì)產(chǎn)生實(shí)際的調(diào)用代碼(函數(shù)調(diào)用需要知道確切的函數(shù)地址),只是在相應(yīng)的地方做個(gè)標(biāo)記,表示在這里需要調(diào)用某個(gè)函數(shù)。編譯完成產(chǎn)生的是匯編代碼。
如上所述,編譯產(chǎn)生的匯編代碼并不能直接運(yùn)行,因?yàn)橥獠亢瘮?shù)調(diào)用的地方還沒(méi)給予確切的函數(shù)地址。這個(gè)工作由鏈接過(guò)程完成。鏈接器會(huì)查找其它源文件所產(chǎn)生的匯編代碼,進(jìn)而找到正確的函數(shù)調(diào)用地址,然后用這個(gè)地址替換掉在編譯時(shí)做的標(biāo)記。完成這一步后,程序就可以實(shí)際運(yùn)行了。
因此,.h是根本不會(huì)被編譯的,它如果被包含,則會(huì)被預(yù)處理器將其內(nèi)容一分不差的拷貝到.c文件中,.編譯器編譯的是拷貝后的這個(gè).c文件。

2.分文件管理:
因?yàn)轭^文件在預(yù)處理階段就已完成,所以不會(huì)降低代碼效率,因此解決1中代碼效率低的問(wèn)題

頭文件

#pragma once

#include
using namespace std;
#include

//來(lái)自自定義類(lèi)型
struct TrueType
{};

// 對(duì)應(yīng)自定義類(lèi)型
struct FalseType
{};

//隱示實(shí)例化
template
struct TypeTraits
{
    typedef FalseType PODTYPE;  // plain old data
};

//顯示實(shí)例化
template<>
struct TypeTraits
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits
{
    typedef TrueType PODTYPE;
};
template<>
struct TypeTraits
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits
{
    typedef TrueType PODTYPE;
};

template<>
struct TypeTraits
{
    typedef TrueType PODTYPE;
};

void TestCopy();

源代碼

#include"Type_extraction.h"

template
void Copy(T* dst, T* src, size_t size, TrueType)
{
    // T的類(lèi)型:內(nèi)置類(lèi)型
    memcpy(dst, src, sizeof(T)*size);
}

template
void Copy(T* dst, T* src, size_t size, FalseType)
{
    // T的類(lèi)型:自定義類(lèi)型---原因:自定義類(lèi)型中可能會(huì)存在淺拷貝
    for (size_t i = 0; i < size; ++i)
        dst[i] = src[i];
}

template
void Copy(T* dst, T* src, size_t size)
{
    Copy(dst, src, size, TypeTraits::PODTYPE());
}

void TestCopy()
{
    int array1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    int array2[10];
    Copy(array2, array1, 10);

    string s1[3] = { "1111", "2222", "3333" };
    string s2[3];
    Copy(s2, s1, 3);
}

測(cè)試文件main.c

#include"Type_extraction.h"

int main()
{
    TestCopy();
    return 0;
}

模板的聲明和定義必須放在一個(gè)文件原因
https://blog.csdn.net/chigusakawada/article/details/78752668
顯示實(shí)例化,隱式實(shí)例化概念
https://blog.csdn.net/qiujianjian/article/details/84792608

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)站欄目:C++類(lèi)型萃?。ǚ治募芾恚?創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://weahome.cn/article/dogidc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部