• 首頁
  • About Me

懶泥陳的技術手札

Python、AI、與資料分析

C++

[ C++ ] 對整數型別賦值

9 2 月, 2018 by lenny0929 Leave a Comment

基礎物件的型別決定了物件能夠存放的值。

所以如果將超出某型別允許範圍的值指派給一個該型別的物件。

ex. 32bit 的作業系統 中的 int 可容納 2³² 的數值範圍 = -2,147,483,648 ~ 2,147,483,647。

Q: 所以如果將 5,000,000,000 丟到 int 中會發生什麼事 ?

[ 閱讀更多 …]

Posted in: 技術 Tagged: C++

[ Cocos2dx – C++] 編譯時間過長的解決方案

9 2 月, 2018 by lenny0929 Leave a Comment
在遊戲專案進行一段時間後, 隨著檔案數量的增加, 往往會發現專案的編譯時間會越來越長。 而 C++ 的特性也使得原始碼檔案會隨著時間而暴漲。

那麼編譯時間的增長原因究竟有哪些?

  • 1. 標頭檔 include 不必要的檔案過多, 往往是因為沒有嚴格使用 Forward Declaration 的方式, 導致專案中的源碼相依關係過高, 造成編譯時間暴增。

在《Effective C++》中的第 31 項條款,對於編譯依存關係的問題,刻下每位程式設計者都應該謹記於心的三條戒文:

1. 如果 object references 或 object pointers 可以完成任務,就不要使用 objects。

2. 如果能夠,盡量以 class 的宣告取代 class 的定義。

3. 不要在表頭檔中 #include 其他表頭檔,除非你的表頭檔不這樣就無法編譯。

好吧, 萬一真的很懶散, 隨便寫程式, 要用什麼方式來解決這個問題!?

可以使用 cppclean 這個小工具來幫助你找到 header 檔中不必要的引入。

cppclean Github

  • 2. 將開源的 Cocos2dx 的 c++ 專案中的原始碼都引入專案中。

Cocos2dx 本身的 c++ 專案就蠻肥的, 有八百多個原始檔案, 光本身第一次編譯的時間就挺讓人不耐煩, 如果沒有要更改的話, 建議可以使用 Prebuild 的版本丟入專案中。

prebuild 的連結。

  • 3. 程式碼的架構不夠扁平 。 簡單說, 改到越底層的檔案, 所有與該檔案相關的原始碼都需要重新編譯。 所謂的相關也就是程式碼有相依性。

減少元件之間的相依性, 往往是個不錯的習慣, 而架構越扁平, 帶來的是相依性的降低, 卻也讓元件的重複使用可能性降低, 這個拿捏就需要些經驗了。

One more thing.

Large Scale C++ Software Design 所介紹的 Redundant Guards 的技巧是幫助不大的。

// Somefile.h
#ifndef SOMEFILE_H_
#include “SomeFile.h”
#endif
#ifndef SOMEOTHERFILE_H_
#include “SomeOtherFile.h”
#endif

# pragma once 也是一樣的情況。

有興趣看原文的可以參考。


最後, 我們有個關於 Cocos2d-x 的Facebook社團, 如果有任何疑難問題, 歡迎到社團發問。

Cocos2dx Taiwan 開發者社團

Posted in: 技術 Tagged: C++

[C++] Lambda 語法簡介

9 2 月, 2018 by lenny0929 Leave a Comment

Lambda expression 是一種匿名函數的表示方式,它可以讓程式設計師將函數的內容直接以 inline 的方式寫在一般的程式碼之中,省去另外定義函數的麻煩,使用時機跟 functor 與 function pointer 類似,一般的狀況都是使用 lambda expression 定義一個匿名的函數,然後再將此函數當作另外一個函數的傳入參數來使用。

可以說類 Lambda 語法的形式, 在各種現代的語言中 (ex. Java, Swift, Obj-C …) 都有類似的實現, 在需要 Callback函式呼叫時尤其好用。

Lambda expression 基本的用法

Class A;
[ A ] (int x) -> int
{
 int n = x + y;
 return n;
}
  • A 為傳入的變數, 若需要引用lambda函式外的變數, 由此傳入, 預設為使用傳值的方式(Call by value)
  • int x 為傳入函式的變數
  • -> int 為宣告Lambda函式回傳變數型態的語法

Lambda 簡單範例

int main() {
auto square = [](int x) -> int { return x*x; };
cout << square(3) << endl;
}
  • cout結果: 9

Lambda 語法參考

  • C++11 Lambda Expression 語法教學與範例
Posted in: 技術 Tagged: C++

[C++] function用法

9 2 月, 2018 by lenny0929 Leave a Comment

function 是一個舊用法新用, 主要可以用來取代舊有的 Function pointer 以及 Function object的寫法。
簡單的理解是可以把函式拿來像變數使用, 傳入其他的函式中。

function 的基本用法

  • 標頭檔 : #include < functional >
  • 範例: 宣告一個 function, 可以傳入一個 bool, 一個float當變數, 以及傳回一個int值
    function < int (bool, float) > nameOfFunction;
    

function 的範例

class fClass {
public:
  static int square (int x) {
     return x*x;
 };
};

int main(int argc, const char * argv[]) {
    function< int (int) > squareFunction;
    squareFunction = fClass::square;
    cout<< squareFunction(3);
    return 0;
}
  • cout 結果: 9

function 參考

  • 在 C++ 裡傳遞、儲存函式 Part 1:Function Pointer
  • C++ 11 function

最後, 我們有個關於 Cocos2d-x 的Facebook社團, 如果有任何疑難問題, 歡迎到社團發問。

Cocos2dx Taiwan 開發者社團

Posted in: 技術 Tagged: C++

C++ 內建型別 (Built-in Type) 變數的初始化

9 2 月, 2018 by lenny0929 Leave a Comment

C++ 內建型別會不會被自動初始化, 與它在哪裡被定義有關。
[ 閱讀更多 …]

Posted in: 技術 Tagged: C++

C++ string 操作注意事項

9 2 月, 2018 by lenny0929 Leave a Comment

string 的 size 操作和 empty 操作

常使用的 c++ 函式庫會附帶 size() 以及 empty() 操作, 前者是給予對應的長度, 後者是簡單的回傳是否為空。
需特別注意的是 size() 回傳的是一個 string::size_type, 而非常見的基礎型別。
[ 閱讀更多 …]

Posted in: 技術 Tagged: C++

C++ 使用內建 GNU 編譯器或 Microsoft 編譯器

9 2 月, 2018 by lenny0929 Leave a Comment

指令參考

在不同的編譯器和作業系統上, 叫出 C++ 編譯器的指令都不同。
GNU 編譯器的預設指令是 g++
Mac: 在 Terminal環境下
$ g++ prog1.cpp -o prog1
$ 為系統提示號。 這個指令會生成一個 prog1 或 prog1.exe
$ ./prog1
這指令可以執行對應生成的檔案
[ 閱讀更多 …]

Posted in: 技術 Tagged: C++

近期文章

  • AutoEncoder 自動編碼器來建構生成模型
  • AutoKeras 的模型搜尋行為
  • 如何檢視 TensorFlow 資料集中的資料 ?
  • AutoKeras 可接受的輸入資料格式
  • 神經網路模型的資料預處理

分類

  • AI (7)
  • Python (4)
  • SEO (1)
  • 創業 (13)
  • 學習 (15)
  • 技術 (63)
  • 產品 (12)
  • 閱讀筆記 (3)

Copyright © 2023 懶泥陳的技術手札.

Omega WordPress Theme by ThemeHall