2020/04/04

[golang]sliceの先頭に追加してみよう!

意味も無くタイトルでテンションを上げてみました。

データのパケットを作る関数を考えよう。
パケットの詳細を上位層に知らせないようにするため、パラメータをもらって中で加工するはずだ。
加工する際には、パケットの構造によってパラメータを切った貼ったすることだろう。

 

今回はNFCのtagでID読込だけすることにしたので、まずはInListPassiveTargetのパケットを作ろうとしている。
このパケットは汎用的といえばいいのか、NFC-A, B, Fの誰もが使うのだけど、パラメータに共通性はほとんどない。
まあ、このパラメータがほぼそのままRFで飛んでいくのだから仕方あるまい。

 

それはともかくとして、上位層からもらったデータをInListPassiveTargetの形式に収めるのに切った貼ったしたい。
RC-S956のパケットは可変長なのでsliceを使っている。
なので、sliceへの追加という処理が必要だ。


sliceにはappend()という関数があるので、それを使えば用は済む。
そう思っていたのだが、検索していると「遅い」という言葉がよく出てきた。
JavaでStringの処理をするような、そんな雰囲気だろう。

【Go言語】append使い分けのススメ 〜スライスの先頭へ要素を追加するとき、中身の型は固定長?可変長?〜
https://medium.com/eureka-engineering/go%E8%A8%80%E8%AA%9E-append%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%AE%E3%82%B9%E3%82%B9%E3%83%A1-%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%AE%E5%85%88%E9%A0%AD%E3%81%B8%E8%A6%81%E7%B4%A0%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D-%E4%B8%AD%E8%BA%AB%E3%81%AE%E5%9E%8B%E3%81%AF%E5%9B%BA%E5%AE%9A%E9%95%B7-%E5%8F%AF%E5%A4%89%E9%95%B7-dbf31fbf2f69

URL長いよ。。。

それはともかく、パケット生成程度では気にするものではなさそうだ。
たぶんデバイスとの送受信の方が時間かかるだろう。

 

私が思ったのは、コンパイラの限界についてだ。

ハードウェア制御をしていると、ここはアドレスバスを1本ずらしてRAMに接続しているから必ず16bitでアクセスしないとだめ、みたいな状況がしばしばある。
もちろん、コンパイラはそういう状況は知らないので、こっちがソースコードを書いたそのままコンパイルせざるを得ない。

 

そういう外部の状況であれば仕方が無いとして、C言語をメインで使っている人間としては、そういう使い分けを勝手にやってくれるようになってるんじゃないかと期待してしまう。

どうなんだろうか、どうなんだろうか。
私はgccを主に使っていたので、その範囲だとgcc4になって最適化が行いやすくなったような話を聞いた気がする。
しかし、関数単位でやっていると、そこは最適化しにくいだろう。inlineくらいか。

そういう下位層の部分はしかたないとしても、コピーしながら領域を拡張していくようなタイプだったら、うまいことやってくれてもいいのでは・・・。

もしかすると、append()は以前はなかったけれども、あまりにも使い勝手が悪いのでやむなく追加した、とかいう経緯があるのかもしれない。

 

まあいい、ともかく対処はいるのだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。