Rubyとクリエイティブコーディングの輪の広がり / The Growing Circle of Ruby and Creative Coding
あらまし プロファイラとにらめっこしながら気合を入れて最適化していくと、最終的に上位に std::vector<char>::resize() が残った、という経験が度々ある。 該当ケースは大抵 std::vector<char> を一時バッファとして利用しており、頻繁に resize() が呼ばれ、サイズは数十~数百 MB 規模に及ぶ、といった感じである。std::vector の resize() は新規に追加される要素に対してはコンストラクタを呼ぶが、組み込み型の場合はゼロクリアがなされる。大きなメモリ領域へのゼロクリアは重い処理であるため、プロファイル上位に残ることになるのだが、一時バッファは基本的にゼロクリアは不要であり、純粋に時間の無駄である。この無駄をなんとかしたい。 根本的な話として、こういう状況では std::vector<char> は使うべきではないと思う。mallo
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; }
2019-11-23 AutoTicketLinkName 2017-02-23 MenuBar 2016-12-10 その他/関数のポインタのサンプルとマトリックスで使う その他 2016-11-14 フリーソフト/指定した文字列が何個存在してくる確認する・nanko 2016-11-13 フリーソフト FrontPage 2016-01-27 PukiWiki InterWiki InterWikiName SandBox 2015-03-20 宣言 ファイル/バイナリファイルの書き込みと読み込み・fopen,fwrite,fread メモリ/動的にメモリを取得する・malloc メモリ/指定したバイトの指定個数分メモリを確保する・calloc 日時/UNIX時間(time_t)を文字列の日時に変換する・time, localtime ソート/qsortを使って文字列のポインタのソート
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++ AMP や C++/CX なんかの亜種も注目されてる、きょうこの頃。 そんな、いわずとしれた C++ のグルである Bjarne Stroustrup せんせい。 ビャーネとか、もっと親しみを込めてハゲなどと呼んでおけば問題は表面化しないのですが。 困ったことに、せんせいはデンマーク人なのでした。 ふだん英語を話している人たちも、先生の苗字はどう呼んだらいいか分からないのです。 日本では Wikipedia*1 が「ストロヴストルップ」「ストラウストラップ」「ストゥロウストゥループ」のカナ転写を紹介し、ちまたでは「すぽっすぽっ」「すっぽすっぽ」などのバリエーションで呼ばれています。はて、どれが正しいのでしょうか? せんせいが英語話者のために書いた FAQ*2 には 発音は北欧っ子*3じゃないと難しいかもね。いままで聞いたなかでいちばんオス
このページは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
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く