トップ «前の日記(2008-08-01) 最新 次の日記(2008-08-03)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|

ToDo:


2008-08-02

_ jsstr.c

http://d.hatena.ne.jp/Gimite/20080802/1217647596

の予想は正しげ。

JSString *
js_ConcatStrings(JSContext *cx, JSString *left, JSString *right)
{
    if (!JSSTRING_IS_MUTABLE(left)) {
        /* We must copy if left does not own a buffer to realloc. */
        s = (jschar *) JS_malloc(cx, (ln + rn + 1) * sizeof(jschar));
        if (!s)
            return NULL;
        js_strncpy(s, ls, ln);
        ldep = NULL;
    } else {
        /* We can realloc left's space and make it depend on our result. */
        JS_ASSERT(JSSTRING_IS_FLAT(left));
        // これ!
        s = (jschar *) JS_realloc(cx, ls, (ln + rn + 1) * sizeof(jschar));
        if (!s)
            return NULL;

        /* Take care: right could depend on left! */
        lrdist = (size_t)(rs - ls);
        if (lrdist < ln)
            rs = s + lrdist;
        left->u.chars = ls = s;
        ldep = left;
    }

    js_strncpy(s + ln, rs, rn);
    n = ln + rn;
    s[n] = 0;
    str = js_NewString(cx, s, n);
    if (!str) {
        /* Out of memory: clean up any space we (re-)allocated. */
    } else {
        JSFLATSTR_SET_MUTABLE(str);

        /* Morph left into a dependent prefix if we realloc'd its buffer. */
        if (ldep) {
            JSPREFIX_INIT(ldep, str, ln);
        }
    }

    return str;
}

(14:34)

_

Ruby の String ってたしかゼロ終端かつ文字数知ってる みたいな感じだったっけ。 となると + にこの最適化はできないだろう。 C 拡張書かせること考えると正しい判断なんだろう

(14:46)

_ プロゴルファーへの道

  • プログラマの労働量の定量化は大変です
  • 以下の方法を提案します
    • 納品物から、10関数程度をランダムに選択する
    • それらからコメントや空白を除去したバイト数 A を計算する
    • プロゴルファーが圧縮したバイト数 B を計算する
    • 総バイト数 * B / A == 総ゴルフバイト数 が当社の提案する新評価法です
  • ゴルフバイト見積り屋としてプロゴルファーが商売として成立するようになる
  • ゴルフバイト対策コンサルとしてもプロゴルファーが成立
  • ゴルフバイトを大きく見積ってもらうように賄賂が常習化

(14:57)

本日のツッコミ(全8件) [ツッコミを入れる]
_ Gimite (2014-05-24 01:41)

おお、わざわざありがとうございます。Rubyに適用できないのはそのとおりだと思います。

_ shinh (2014-05-24 01:41)

なんか RString はゼロ終端してるけど保証はしてないとか教えてもらいました。将来的には JS 的なことやってもいいのかも。

_ 星一 (2014-05-24 01:41)

ゼロ終端しないという風にしてしまうと結構な量の拡張ライブラリが動かなくなりそうな。自分はてっきり保証されているものだと思っていました。

_ shinh (2014-05-24 01:41)

StringValueCStr 使うのがグッドプラクティスらしいです

_ 星一 (2014-05-24 01:41)

StringValuePtr ではだめなんでしょうか。 StringValueCStr だと途中に Null 文字があったりするときに例外が投げられてしまうのですが。

_ 星一 (2014-05-24 01:41)

途中に Null 文字があるような文字列を扱う場合は、何にせよ文字の長さを意識する必要があるので、ゼロ終端である必要はないってことか。 (多分) 自己解決しました。

_ なかむら(う) (2014-05-24 01:41)

星さんの理解で正しいです。
なおその辺の仕様については1.9のREADME.EXT(.ja)に明記されています。

_ 星一 (2014-05-24 01:41)

ありがとうございます。

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

2008年
8月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
1.星一(2014-05-24 01:41) 2.なかむら(う)(2014-05-24 01:41) 3.星一(2014-05-24 01:41)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h