Ubuntu 16 遇到的 g++ 5.x ABI 不相容問題

Heresy 目前開發跨平台的 C++ 程式的時候,主要是透過 Windows 10 的「Bash on Ubuntu on Windows」這個 Windows Subsystem for Linux(WSL)來進行操作的。

在微軟剛貼出的時候,他的 Ubunutu 版本還是 14,而後來在微軟推出 Creators Update (1703) 的時候,也把 Ubuntu 的版本升級到 16.04 了~而在 Ubuntu 系統版本升級的同時,系統預設使用的編譯器也由 g++ 4.x 更新到 g++ 5.x 了。

而也因為這樣,當 Heresy 要做 Linux 環境的建置測試的時候,也碰到了一些問題,這邊就稍微紀錄一下了。

首先,會有問題的主要原因,是 GCC5.1 在發布的同時,也推出了新的 libstdc++;而這個 C++ 的標準函式庫為了符合 C++11 的標準,重新實作了 std::stringstd::list;而這兩個類別由於遵循了新的規範(禁止 Copy-On-Write),所以變得和舊版的函式庫不相容。

為了避免混亂,gcc 5.1 修改了對應的 ABI(Application binary interface),像是 std::list<int> 實際上會是定義成 std::__cxx11::list<int> 的形式;基本上,就是有部分標準函式庫的東西的 namespace 會從 std 變成 std::__cxx11 了。

閱讀全文

廣告

使用 Parameter Pack 取代 switch 來做型別的展開

之前在寫《C++11 的「…」:Parameter Pack》的時候,有提過 Heresy 其實不太知道這東西該怎麼用?不過後來過了一小段時間,Heresy 倒是找到了一個可能的應用了!那就是用來

取代 switch case、拿來做型別的判斷、展開!

有的時候,在資料結構上可能會因為資料有不同的型別、而使用 template 來實作,然後再讓他去繼承一個抽象類別,來方便操作,例如下面就是一個例子:

class AbsData
{
public:
	virtual EType getType() const = 0;
};
 
template <typename TYPE>
class TData : public AbsData
{
public:
	TYPE mData;
 
	EType getType() const override;
};

在上面的程式碼中,AbsData 就是定義介面用的抽象類別,而 TData<> 則是可以對應各種型別的實作。

閱讀全文

C++14 編譯階段的整數序列的 integer_sequence

這篇雖然是在講 C++14 的「std::integer_sequence」(cppreference),不過實際上應該算是之前《C++11 的「…」:Parameter Pack》一文的延伸。

std::integer_sequence 是一個用來建立編譯階段(compile-time )的整數序列(不是陣列)的 template class,定義如下:

template< class T, T... Ints >
class integer_sequence;

而他是被定義在標準函式庫的 <utility> 這個標頭檔裡面,所以要使用的話,就需要引入這個檔案。

他最基本的使用方法大致上如下:

std::integer_sequence<int, 1, 3, 5, 7>()

這樣就代表了一個型別是 int 的序列、裡面有 1, 3, 5, 7 四個數值。

閱讀全文

C++11 的「…」:Parameter Pack

這篇文章,是當 Heresy 想研究「metaprogramming」(維基百科)的時候,看《Practical C++ Metaprogramming》這本書(O’Reilly)之後,跑去研究後的東西。

Parameter pack 是 C++11 在 template 這邊所新增的東西,主要分成「template parameter pack」和「function parameter pack」兩部分;他最明顯的特徵,就是程式碼裡面會多出一堆「…」了~ XD

這部分的文件,可以參考 cppreference,Heresy 這邊算是簡單紀錄、整理一下。

閱讀全文

微軟正式推出 Visual Studio 2017

微軟又針對旗下的程式開發環境、Visual Studio 推出新版本囉~這次的版本是 Visual Studio 2017,目前也已經可以下載安裝了~它的官方網站是:

https://www.visualstudio.com/zh-hant/

而新功能的介紹,則可以參考「新功能」的頁面(連結)、或是直接看 release note 的細節(連結)。

目前的 Visual Studio 有三個版本,包括了免費的社群版(Community、官網)、一般人用的專業版(Professional、官網),以及最高階的企業版(Enterprise、官網)。

閱讀全文

讓函式回傳多個值:std::tuple

在 C++ 的規範裡面,一個函式基本上只能回傳一個值;但是實際上,很多時候,我們會希望、也有需要讓一個函式可以回傳超過一個值。

這時候,常見的方法大概會是兩個方向:

  1. 把要回傳的值,以函式的參數的形式,來做傳遞
  2. 建立一個特殊的結構、或類別,來把要回傳的值打包起來

前者感覺應該比較像是 C 的寫法,像是微軟的 Kinect for Windows SDK v2 基本上就可以說是這種風格;他把回傳值都用來回傳執行的結果,而真正的資料,則都是以參數來做傳遞。

後者基本上比較像是 C++ 的物件導向,也算是很常見的、很好實作的;像是 std::minmax()參考)就是把兩個回傳的值、以 std::pair<> 的形式來做封包、回傳。

閱讀全文

微軟 2016 程式開發相關消息

這篇算是稍微整理一下,微軟在 Build 2016 大會上(官網),一些關於程式開發的新消息。

在 Heresy 個人來看,這幾年微軟一個很大的方向,應該就是「跨平台」吧…包含前幾天的《Windows 10 將可以跑 Linux 的 Bash shell 和 Ubuntu 的程式了》,以及更早的 Visual Studio Code 在內,微軟現在似乎越來越主動走向 Linux 社群了…

而這篇的重點,則包含了新的 Visual Studio "15" 預覽版,Visual Studio 2015 Update 2,以及 Visual C++ for Linux Development、C/C++ extension for Visual Studio Code;而在 .Net 那頭,更是喊出了「開放、跨平台、免費」的口號(參考)。

閱讀全文

C++11 程式的平行化:async 與 future

之前在《C++ 的多執行序程式開發 Thread:基本使用》這系列文章裡面,Heresy 已經大概整理了一下 C++11 提供的 std::thread 這個執行序函式庫的使用方法了。

不過,實際上在 C++11 的「Thread support library」(參考)裡面,除了 std::thread 以外,還有不少東西可以用。這篇要寫的,就是其中的 std::async()std::future<>

基本上,使用 std::thread 來建立一個新的執行序、另外執行某些計算,在 C++ 中算是比較底層的方法;它的功能很彈性,但是相對的,也有一些比較麻煩的地方。比如說透過 std::thread 執行的函式基本上無法回傳值,而在其他執行序中產生的 exception 也沒有辦法被 catch 到。

std::async() 在某方面來說,則算是一個特化的功能,他的設計概念,就是

當要進行一個沒有馬上要用其結果的複雜計算的時候,把計算丟到另一個執行序去,等到之後真的要用的時候,才去確認他跑完沒、並取得他的結果。

閱讀全文

AMD 放大招了…推出 Boltzmann Initiative、支援 CUDA 程式的轉移!

NVIDIA 的 CUDA 架構,基本上應該算是現階段最成功的 GPGPU 環境之一。他在新一代、專門用來做大量平行計算的環境裡面,算是推出最早的,所以相對起來、發展的也算是最完整的;而後來雖然 Khronos 有推出跨硬體平台的開放標準 OpenCL(Intel、AMD、NVIDIA 都有支援),但是就 Heresy 所知,還是有許多開發人員是偏好 CUDA 的。

而 AMD 在 GPGPU 這一塊…個人是覺得發展的始終有點悲劇吧?Heresy 有紀錄的部分,他最早是推出自家的「Stream SDK」,而之後就徹底捨棄自己的語言、完全轉投向 OpenCL、Stream SDK 也改名為「AMD APP SDK」了。

儘管 AMD 也試著在靠 OpenCL、以及後來所推出、基於 AMD APU 的「Heterogeneous System Architecture」(異質系統架構、官網)來做平行計算的發展方向(AMD 稱之為「Heterogeneous Computing」、異質計算),但是實際上…就個人所知,成效似乎不算是很好。

閱讀全文

C++ Core Guidelines

「C++ Core Guidelines」是在 CppCon 2015 這個 C++ 的 conderence(官網)被提出來的,這個專案目前還在發展中,它的內容都放在 https://github.com/isocpp/CppCoreGuidelines 裡。

這個「Guidelines Prohect」的主要目的,是希望可以盡量針對問題,提出好的答案、讓大家可以參考、更有效率地寫出更好的 C++ 程式。

而最主要的介紹,應該是可以參考 Bjarne Stroustrup(C++ 之父、維基百科)的《Writing good C++14》(投影片YouTube)這份簡報。其他在 talks 資料夾(連結)中,也有其他的投影片,在 docs 資料夾(連結)中,目前則有兩份文件。

閱讀全文