Firebase Dynamic Linksの代替手段を自作する / Create your own Firebase Dynamic Links alternative

Part 1 of this series about my toy renderer covers the most fundamental design decisions. Over the years, I have written many renderers and for a long time their complexity kept growing. This time, I took the opposite route. I wanted to maximize the fraction of code that implements crucial functionality rather than wasting my time on bloaty infrastructure. The code that I wrote (excluding shaders)
#include <stdio.h> void fizzbuzz(int n) { int next; int i = 1; do { printf(i % 15 ? i % 5 ? i % 3 ? "%d\n" : "Fizz\n" : "Buzz\n" : "FizzBuzz\n", i); if (i++ >= n) next = 0; } while (next); } int main(void) { printf((char[]){""}); // この位置にprintfが無いとなぜか動かない fizzbuzz(100); } gcc 10.1.0 を使用し、コンパイラが感知したミスには警告を出力してくれる様 -Wall -Wextra を指定し、最適化指示なしでコンパイル、動作させたところ動作するが Wandboxで実行 main() の中の何も出力していない printf(
競技プログラマ、どうせ #define しか使わなくないか if の初期化文 if 文の中に初期化文を書けるようになります。 たとえば、よくある DP の例を挙げます。 if (dp[next] > dp[cur] + cost) { dp[next] = dp[cur] + cost; ... } これは次のように書けるようになります。 if (int tmp = dp[cur] + cost; dp[next] > tmp) { dp[next] = tmp; ... } うーーん、chmin を書いた方が楽かな(せめて #define じゃなくて関数テンプレートを使ってほしい) tmp が if の外に漏れないので変なバグを防げたり、同じ式を書かないで済むのはうれしそう。 ja.cppreference.com 構造化束縛 pair や tuple からまとめて初期化できます。 たと
メモリ破壊を起こすソースコード まず、メモリ破壊を起こすサンプルとしてバッファオーバーフローを起こすoverflow.cを準備します。 overflow.c #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main(void) { uint8_t *ptr = NULL; // 64byte分のメモリ領域を取得 ptr = (uint8_t *)malloc(64); if (NULL == ptr) { fprintf(stderr, "out-of-memory\n"); exit(EXIT_FAILURE); } // メモリ破壊箇所 // メモリ領域を1byteはみ出した位置に適当なデータを挿入 ptr[64] = 0x5a; free(ptr); return 0; }
Electric Fenceのインストール† Electric Fenceは以下のパッケージになります。 x86_64版 ElectricFence.x86_64 : メモリ割り当ての侵略を検出するデバッガ i386版 ElectricFence.i386 : メモリ割り当ての侵略を検出するデバッガ ともに以下のコマンドでインストールすることができます。 rootユーザでインストールしてください。 yum -y install ElectricFence ↑
AtCoder の言語アップデート で、C++17 対応コンパイラが使えるようになりました。やったー! この記事では、競技プログラミングに役立つ C++17 の新しい標準ライブラリ・言語機能を 16 個紹介します。 サンプルコードは、AtCoder の GCC 9.2.1 システムで動作を確認しています。 C++17 標準ライブラリ機能 1. 値を範囲内に収める std::clamp(x, min, max) 値 x を、min 以上、max 以下に収めてくれる関数です。 これまで std::max(std::min(x, max), min) と書いてたのが 1 つの関数で済みます。 #include <bits/stdc++.h> int main() { // 値を 0 以上 100 以下に収める std::cout << std::clamp(50, 0, 100) << '\n'
もう10年以上も前になりますけども,近場の漁港によく連れて行ってもらって魚釣りしていました. ちょうどアジは西日本の日本海側が本場ということもあって,僕の地元では岸壁に立ってサビキをすると小アジがたくさん釣れました. さて,google-glogと言えばgoogle謹製のログライブラリ. Google Japan Blog: C++ のプログラムのデバッグを楽にする方法にて概要が紹介されていて,ドキュメントには簡単なチュートリアルがあります.基本的には使い方に難しいところは何も無いです. お魚さん的には学部卒論のときから使っててもはや手放せないんですが,作業が切羽詰ってくるとあんまり律儀にログを出す余裕がなくなってきますw そんな時でもただ一ついつでも使ってたのが,「落ちた時にスタックトレースを吐く機能」です. ということで今回はそれに絞って紹介.まとまった記事を書くには今時間的余裕がない
この記事はCompetitive Programming (2) Advent Calendar 2019 - Adventarの4日目の記事です。 私がC++で競技プログラミングをやり始めた際によく分からなかったものの筆頭がイテレータでした。便利でv.begin(), v.end()のようなお決まりの書き方はできても、少し普段と違うことをしようとすると混乱しがちです。 このようなものは手元で図を描いて整理できるようになる、つまり視覚的に理解できることがとても大事だと思います。そこでイテレータについて「こういう風に理解すると図示しやすくなるかもよ」という視覚的な理解を提示したいと思います。 競技プログラミングでよく使う処理を中心に扱っていきますが、それ以外でC++を書く人にとっても理解の助けになる…かもしれません。 std::vectorのイテレータ まずは一番分かりやすいものからいきます
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 「可変引数テンプレート (variadic templates)」は、任意の型とそのオブジェクトを任意の数だけ受け取る機能である。これによって、「最大でN個のパラメータを受け取る関数テンプレートやクラステンプレート」を実装する際に、N個のオーバーロードをユーザーが用意する必要なく、ひとつの実装だけで済むようになる。 可変引数テンプレートとしてテンプレートパラメータを受け取る場合、テンプレートパラメータを宣言するclassまたはtypenameとテンプレートパラメータの間に、省略記号 ... を入力する: // 0個以上のテンプレートパラメータを受け取る template <class... Args> struct X; // 0個以上の任
いや,デバッガ使えよ ← Kobitoからの投稿テストも兼ねて. 仕様 1. メッセージは標準エラー出力に出す なんとなく標準出力じゃねーだろと思った. fprintf( stderr, ... )で実装する. 2. コンパイル時に-D NDEBUGで何もしないようにする リリース時を考えて,何もしないようにする機能が欲しかった. -D NDEBUGにしたのは,assert()と一緒に使えばいいと思ったから. 3. printfらしく使いたい つまり,フォーマット指定子を使いたい. となれば,必然的に可変長引数を扱える必要がある. 4. 表示メッセージに行番号とか入れたい デバッグに使うものですからね. 最低限【ファイル名】と【行番号】は欲しい. この場合,マクロで定義する必要がある. [日付] ファイル名:行番号 # メッセージとかイイネ! 5. C99規格準拠 仕様3および4より. C
C++11のstd::swapは、だいぶ大きく変更された。C++03までのswapは、<algorithm>にあり、CopyConstructibleかつAssignable(C++11のCopyAssignableに相当)を要求した。ところが、C++11では、<utility>に移されたあげく、MoveConstructibleかつMoveAssignableを要求するようになった。まるっきり別物になってしまっているのだ。果たして問題を起こさないものだろうか。おぼつかないものだ。 実装例は以下のようになる。 // C++03のswap template < typename T > void swap( T & a, T & b ) { T temp = a ; a = b ; b = temp ; } // C++11のswap template < typename T > void
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 ムーブセマンティクスはコピーコストの削減を主な目的としており、また所有権の移動を実現する。 右辺値参照はムーブ元のオブジェクト(右辺値)を束縛するための言語機能である。 右辺値(Rvalues)と左辺値(Lvalues)について 誤解を恐れずに言えば、右辺値とは名前をもたない一時的なオブジェクトである。 また、左辺値とは明示的に実態のある名前付きオブジェクトである。 struct Foo{} ; int f() { return 0 ; } int main() { int i = 0; i; // 名前付きオブジェクトは左辺値 0; // リテラル値は右辺値 Foo x ; x; // 名前付きオブジェクトは左辺値 Foo(); // コ
インライン関数についてややこしいところをまとめておきます。 結論から言うと、常に `static inline` を使え、ってことになります。 結果だけ知りたい人は以下は読む必要なし。 ### 最初に ### `inline` キーワードは関数callを高速化せよ、という指定であって、`inline` を付けたからといって、本当にインライン展開されるかはわかりません。 実際のところ、最適化オプションをつけていない場合、`inline` を付けても、一切インライン展開してくれません。 最適化オプションによらず、インライン展開を強制させるには `__attribute__((always_inline))` をつけるというやり方があります。 `-O1` オプションをつけた場合、明示的に `inline` がついている場合はなるべくインライン展開しようとするが、`inline`指定がないものにつ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く