Visual C++ OpenMP 更新:支援 3.1 的 atomic

自從在 2021 年、Visual Studio 2019 開始引入 OpenMP LLVM 後,微軟終於開始有慢慢地開始針對 OpenMP 的標準支援進行更新了。

這次官方的公告是《MSVC OpenMP Update》,就是在介紹 Visual Studio 2022 17.4 中針對 C++ OpenMP 的更新了!官方的說法,是他們正在讓 Visual C++ 更符合 OpenMP 3.1 的標準。

這次更新的內容主要是:

  • 支援 OpenMP 3.1 的 #pragma omp atomic
  • 支援 min / max reduction
  • 支援指標型變數的 #pragma omp for

閱讀更多»

C++20 chrono 的日曆功能

很久以前,Heresy 曾經寫過 C++11 加入的 std::chrono 這個時間函式庫的介紹。而後來在 C++20 的時候,則又有在裡面追加「日曆」(calendar)喊「時區」(time zone)的功能,因為最近剛好有碰到這部分的東西,所以這邊就來稍微寫一下吧。

而這篇呢,就先針對日曆的部分來寫吧。

Chrono 提供的日曆的功能,主要針對了年、月、日都另外定義出了型別,而同時也提供了星期幾這樣的內容;進一步的,還有某個月的最後一天是幾號這類的訊息,對於某些印用來說,應該也算是有幫助的?

閱讀更多»

C++ 安全地比較 signed 和 unsigned

在強型別的 C++ 裡面,針對整數型別大多都有提供「有號」(signed、允許負數)和「無號」(unsigned、只有 0 和正數)兩種;像是以一般的整數來說,就有 intunsigned int 兩種,可以根據自己的需求來選擇要用哪種。

但是有的時候,我們難免會有需要要把資料在這兩種不同的中做轉換、或是拿來比較;而這個時候,其實是有相當的風險的…

像是以比較來說,可以來看下面這段程式碼:

#include <iostream>
 
int main()
{
  long           a = -100;
  unsigned short b = 100;
  size_t         c = 100;
 
  std::cout << (a < b);   // 1
  std::cout << (a < c);   // 2
}

閱讀更多»

用 PowerShell 直接下載 SourceForge 的檔案

目前還是有相當多的開源函式庫是放在 SourceForge(網站)上,要下載檔案的話,在透過網頁操作的時候,基本上都會先跳到一個等待的頁面、等個五秒鐘之後,會從一個比較合適的分流伺服器下載。

正常來說,這樣的操作雖然多耗了一點時間,但是影響不大。但是如果是在自動化環境(例如 CI/CD)下,要使用指令來下載的話,就可能會碰到一點問題。

以 GDCM 這個專案(連結)來說,要下載最新的檔案,連結會是 https://sourceforge.net/projects/gdcm/files/latest/download;而在 Linux 環境下,要用 wget 下載的話,用下面的指令就可以了,沒有太大的問題。

wget https://sourceforge.net/projects/gdcm/files/latest/download -Ogdcm.tar.gz

閱讀更多»

C++ 的靜態多型:CRTP

這篇來寫個 C++ 的老東西、curiously recurring template pattern(CRTP、中文被翻譯成「奇異遞迴模板模式」、維基百科);這東西其實很早就有了,在 1980 年就有了,當時似乎是被稱為「F-bounded quantification」?

CRTP 基本上是一種 template + 繼承的變形語法、形式很特別,基本上會長的像下面的樣子:

template <class T>
class Base
{
public:
  void interface()
  {
    static_cast<T*>(this)->implementation();
  }
};
 
class Derived : public Base<Derived>
{
public:
  void implementation() {}
};

閱讀更多»

GitLab 在 Markdown 中提供可以過濾、排序的 JSON Table

前幾天,GitLab 更新到了 15.4 版(官方公告),而這次的更新在 Heresy 來看,加入了一項相當實用的功能,那就是 GitLab 的網站系統終於提供可以搜尋、排序的表格了!

一般在 Markdown 裡面要建立表格,基本上都是寫成下面的形式(應該也不是 Markdown 本身的標準就是了):

| header 1 | header 2 | header 3 |
| ---      | ---      | ---      |
| cell 1   | cell 2   | cell 3   |
| cell 4   | cell 5   | cell 6   |

在 GitLab 的網站上,他會顯示成下面的樣子:

閱讀更多»

使用 Crypto++ 進行資料的加解密

這篇算是簡單紀錄一下,前陣子透過 Crypto++ 這個 C++ 的函式庫(官網GitHub)來進行資料加密、解密的紀錄。不過由於 Heresy 和密碼學不熟,所以這邊不會去解釋原理或各種方法,單純是針對怎麼用來做紀錄。

Crypto++ 基本的 header 檔案是 cryptlib.h,主要的 namespace 是 CryptoPP,在使用的時候基本上一定會用到;但是之後根據要使用的演算法,則也還需要另要加上個別的 header 才行。

而在要使用 Crypto++ 加解密的時候,要先決定要用哪種運作模式(mode、官方文件)、以及哪種 block cipher,然後才產生用來加解密的處理器。

閱讀更多»

C++ 的 forward declaration

這邊稍微來講一下 C++ 的 forward declaration(維基百科C++ Reference)。

Forward declaration 的基本概念,以類別來說,就是先告訴編譯器有這樣一個類別存在(宣告),但是這個時候還先不告訴你他的實際內容(定義);在這個狀況下,這個類別會是「incomplete type」,可以有限度地使用。

如果兩個類別要使用到彼此的時候,通常就會需要用到這種技巧,下面就是 C++ Reference 給的一個例子:

class Vector; // forward declaration
 
class Matrix
{
  // ...
  friend Vector operator*(const Matrix&, const Vector&);
};
 
class Vector
{
  // ...
  friend Vector operator*(const Matrix&, const Vector&);
};

閱讀更多»