2015-04-04 118 views
3

我正在研究嵌入式系統(ARM Cortex-M0,所以沒有Linux)。我爲嵌入式平臺編寫了很多C代碼,但這是我第一次進入C++。使用std :: array的代碼大小

在我的C代碼中,傳遞給函數的數組總是佔用2個參數。一個用於指向數據的指針,另一個指向數組的長度。例如:

void write(uint8_t *buf, size_t bufLen, size_t writeLen); 

我考慮這些開關使用std::array(在C++ 11引入)。這很有吸引力,因爲它可以跟蹤自己的長度,但不會進行任何分配。它看起來像相當於將

template<size_t N> void write(array<uint8_t, N> *buf, size_t writeLen); 

如果我的代碼最終調用write與10不同大小的數組,該編譯器最終確定10層不同的功能呢?這似乎可能特別不好,如果我定義一個函數,它有兩個(或更多)陣列,該函數具有在2個參數(每個陣列的尺寸),以作爲模板:

template<size_t N, size_t M> 
void readWrite(array<uint8_t, N> *readBuf, 
       array<uint8_t, M> *writeBuf, size_t writeLen); 

回答

1

在理論上,是的。但是,模板函數必須在使用它的TU中定義。這意味着它很容易內聯。

不過,還可以看看std::vector

0

只要你傳遞的是真正的數組(不是指針),你可以通過將函數重寫爲模板來完成大致相同的操作,但是將引用傳遞給原始數組而不是std::array。這給了我們這樣的代碼:

template <size_t N> 
void write(uint8_t (&buf)[N]); 

所以叫這個,我們可以這樣做:

uint8_t buffer[256]; 

write(buffer); 

uint8_t buffer2[512]; 

write(buffer2); 

...並在第一次調用,編譯器將演繹N爲256,第二個是512.

儘管基本效果是相同的 - 至少潛在地,編譯器仍然會爲您傳遞的每個數組大小生成唯一的代碼。

2

如果write()代碼在編譯時不知道bufLen會帶來多大好處,那麼我沒有看到任何改變它的意義。我離開了原來的函數原型,並添加方便的包裝需求,如:

template<size_t N> 
void write(array<uint8_t, N> &buf, size_t count) { 
    write(buf.data(), buf.size(), count); 
} 

您可以添加更多不同的緩衝樣的類型,例如vectorstring。在經過優化的版本中,所有這些包裝將變得簡單並且內聯,因此不需要重複代碼,儘管在編譯後仍然值得檢查。

下一步是使用array_view這還不是標準。但是你可以從某個地方借用這個實現,或者輕鬆地創建自己的實現。有了它,你可以定義主要功能爲

void write(array_view<uint8_t>, size_t); 

而且你甚至不需要任何包裝,因爲array_view可以從C數組和各種容器被隱式構造。