C++20 的三向比較(Three-way comparison)

三向比較(three-way comparison、參考)是 C++20 新增的一項新的運算子,他的形式是「<=>」;據說是由於外型的關係,所以也被稱為「Spaceship Operator」。

而它的特色呢,則是可以針對兩個變數進行比較,並透過一個回傳值讓使用者可以判斷到底是大於、小於、還是等於;基本上是:

  • a < b 的話:(a <=> b) < 0
  • a > b 的話:(a <=> b) > 0
  • a 和 b 相等或等價的話:(a <=> b) == 0

閱讀更多»

Visual Studio 2022 Lambda + OpenMP 的問題

這篇算是紀錄一下,Heresy 這邊在想把開發環境從 Visual Studio 2019 升級到 Visual Studio 2022 時,踩到的新版編譯器在 lambda expression 這邊的地雷,算是稍微紀錄一下了。

Heresy 這邊踩到的地雷,是 lambda expression + OpenMP 的相容性問題;下面就是一個會出問題的簡單程式碼:

#include <iostream>
 
int main()
{
  auto f = []()
  {
    #pragma omp parallel for //Error
    for (int i = 0; i < 10; ++i)
    {
    }
  };
 
  return 0;
}

閱讀更多»

原生 64 位元的 Visual Studio 2022 正式推出

今年四月,微軟就有公布新的 Visual Studio 2022 會是第一款原生 64 位元的 Windows 整合式開發環境了~而從六月開始,微軟也不停地釋出新的預覽版,讓眾多的開發者幫忙找問題。

現在,Visual Studio 2022 終於推出正式版了!他的官方網站是 https://aka.ms/vs2022,官方的公告則是《Visual Studio 2022 now available》;下面則是官方的介紹影片:

閱讀更多»

在 Qt Designer 內使用自定義的 widget Part2

這篇是之前《在 Qt Designer 內使用自定義的 widget》一文的後續。

其實本來 Heresy 一直以為之前使用 QDesignerCustomWidgetInterface 另外封包一個 plugin 物件出來後就搞定了,但是後來才發現,真正要拿來建立函式庫,還是有點問題。

原因就是:如果在一個專案裡面、按照之前的方法寫多個 plugin 出來的話,在建置的連結階段,會出現重複定義的問題。Visual Studio 得到的錯誤會向下面這樣:

錯誤    LNK2005    qt_plugin_instance 已在 moc_plugin2.obj 中定義過了
QtUIforDesigner    moc_Plugin1.obj    1
錯誤    LNK2005    qt_plugin_query_metadata 已在 moc_Plugin2.obj 中定義過了
QtUIforDesigner    moc_Plugin1.obj    1

閱讀更多»

在 Qt Designer 內使用自定義的 widget

Qt 基本上是一個很有彈性的跨平台圖形介面框架,他本身就提供了很多 widget 可以使用。而除了可以透過程式碼來設計界面外,也可以使用官方提供的 Qt Designer(Qt 設計師、官網),用所見即所得的方法來拉出自己的介面,算是相當地方便。

如果官方提供的 widget 不夠用的話,也可以自己組合既有的元件、或是重頭撰寫一個符合自己的元件來用;這部分有需要話,可以參考官方的《Analog Clock Example》。

而如果想在 Designer 裡面使用自己定義的 widget 的話,就稍微麻煩一點了。這篇就是稍微整理一下,要怎麼在 Qt Designer 裡面、使用自己定義的 widget。

閱讀更多»

C++AMP 已死

C++ AMP 是微軟在 2011 年發表、在 2012 年推出的一套適用於 GPGPU、大量平行化的 C++ 函式庫。他基本上算是相對高階的 GPGPU 開發方案,由於底層是使用 DirectX 來做的,所以理論上能支援不同廠牌的顯示卡(參考《C++ AMP 相關資料》)。

不過,由於 Heresy 這邊還是有考慮到要跨到 Linux 環境的問題,所以簡單玩了一下後,就沒有去認真研究這個東西了。(不過由於 C++AMP 屬於開放標準,倒也真有人在 CLANG/LLVM + OpenCL 弄出了 C++AMP 的實作;參考《Bringing C++AMP Beyond Windows via CLANG and LLVM》)

而前幾天,忽然和到 Google 推薦的文章《C++ AMPの死について》,這才發現原來 C++AMP 也已經被微軟賜死了…

閱讀更多»

C++ 程式執行的順序

不知道一般人覺得下面這段 C++ 程式碼,執行會是什麼結果?

int i = 0;
std::cout << ++i << "/" << ++i << "/" << ++i << std::endl;

很直覺地,感覺應該會是「1/2/3」吧?

但是實際上,如果使用 g++ 6 以前的版本、或是 Visual Studio 2019 的話,應該會很訝異地發現,結果是「3/3/3」!

閱讀更多»

C++ 17/20 的一些數值函式庫

這篇是延續之前的《C++11 的一些數值函式庫》,繼續來整理 C++17C++20 在數值函式庫上的變化。

首先,在 <numeric> 這個 header 裡面(參考),又加入了很多 template 函式可以使用,其中也包含了 gcd(對大公因數)、lcm(最小公倍數)、inner_product(內積)等等;雖然不能說沒用,但是老實說,有需要的人大概都已經有自己的方案了吧…

另外,這次也還有支援平行化reduce(),以及在平行化演算法裡面很常見的 inclusive_scan()exclusive_scan() 可以使用。

閱讀更多»