値の値段
前回取り上げたSwiftに対する不満の1つとして,
密結合しているおかげで循環参照の解消などをプログラマが制御できるのですが,
密結合しているということは別の手法を導入したり, メモリ管理そのものをSwiftで実装することが難しいということでもあります。
今回はメモリ管理とはいったい何なのか,
Swiftの型,CPUの型
Swiftには多彩なデータ型が標準装備されているうえ,
UInt8
,UInt16
,UInt32
,UInt64
。符号付き整数?Int8
からなるただの配列です。少なくとも,
図1は,
スタック(stack)と函数(function)
何百冊に及ぶ長編作品
図2が,UInt64
)
こんまりメソッド
ではスタックさえあればどんなプログラムも動かせるのでしょうか? 理論上はYesです。しかしスタックには大の苦手が1つあります。それは可変長のデータ。たとえば画像をロードしたいとして,
しかし起こり得る最大のメモリ使用量をあらかじめ確保しないともっとヤバイことになります。そう。バッファオーバーフロー
Cプログラムのサンプル
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char s0[8] = "ABCDEFG";
char s1[8] = "0123456";
printf("s0@%p was ・"%s・"・n", s0, s0);
printf("s1@%p was ・"%s・"・n", s1, s1);
char *p = s1;
strncat(p, "789abcde", 15);
printf("s0@%p is ・"%s・"・n", s0, s0);
printf("s1@%p is ・"%s・"・n", s1, s1);
return 0;
}
シェルでの実行
% cc -Wall bufof.c && ./a.out s0@0x7ffee8b96990 was "ABCDEFG" s1@0x7ffee8b96988 was "0123456" s0@0x7ffee8b96990 is "89abcde" s1@0x7ffee8b96988 is "0123456789abcde"
それでは,
- 注1)
- 『人生がときめく片づけの魔法 改訂版』