在程式設計中,我們大多考慮是功能的實現,很少過多的考慮記憶體消耗問題。比如在交換兩個變數的值,大多時候我們是通過第三個變數來進行交換的,真的php來說,通過第三個變數來交換,是比較消耗記憶體的。看下面**
$startmemoryused=memory_get_usage();
$i=5;
$j=6;
$c=$i;
$i=$j;
$j=$c;
var_dump('i='.$i.',j='.$j);
$endmemoryused=memory_get_usage();
$usedmemory=($endmemoryused-$startmemoryused)/1024;
var_dump('新增變數互動消耗記憶體為:'.$usedmemory.'mb');
$startmemoryused=memory_get_usage();
$i=5;
$j=6;
$i=$i^$j;
$j=$i^$j;
$i=$i^$j;
var_dump('i='.$i.',j='.$j);
$endmemoryused=memory_get_usage();
$usedmemory=($endmemoryused-$startmemoryused)/1024;
var_dump('異或互動消耗記憶體為:'.$usedmemory.'mb');
現在我們來看一下,記憶體消耗結果:
這說明如果我們借助第三個變數互動值的話,是通過異或互動消耗記憶體的9.5倍,不測試不知道,一測試還真的嚇一跳啊。
細究其原因,這和php核心中資料結構是分不開的
php在核心中是通過zval這個結構體來儲存變數的,它的定義在zend/zend.h檔案裡,簡短精煉,只有四個成員組:
struct _zval_struct ;
typedef struct _zval_struct zval;
//在zend/zend_types.h裡定義的:
typedef unsigned int zend_uint;
typedef unsigned char zend_uchar;
zval裡的refcout__gc是zend_uint型別,也就是unsinged int型,is_ref__gc和type則是unsigned char型的。儲存變數
值的value則是zvalue_value型別(php5),它是乙個union,同樣定義在了zend/zend.h檔案裡:
typedef union _zvalue_value str;
hashtable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
在以上實現的基礎上,php語言得以實現了8種資料型別,也真是基於這樣的定義,才使得php是比較消耗記憶體的。 php中自變數 PHP 變數
php 變數作用域 變數的作用域是指令碼中變數可被引用和使用的部分,php 中有四種不同的變數作用域 序號作用域 描述local 區域性作用域 global 全域性作用域 static 靜態作用域 parameter 函式引數作用域 1 local 本地的 區域性變數的作用域 在 php 函式內部宣...
PHP 中的變數
變數用於儲存值,比如數字 文字字串或陣列。一旦設定了某個變數,我們就可以在指令碼中重複地使用它。php 中的所有變數都是以 符號開始的。在 php 中設定變數的正確方法是 var name value php 的入門者往往會忘記在變數的前面的 符號。如果那樣做的話,變數將是無效的。讓我們試著建立乙個...
PHP中的變數
變數是儲存內容的別稱,就像人名是人的代稱一樣,php中的變數用來指代數值 字串 陣列等,它的命名要遵守一定的規則 php變數命名規則 變數要以美元符號 開頭,如 abc 2 定義乙個變數abc 變數的名稱必須以字母或者下劃線開頭,不能以數字開頭,如 nba 2 a 3 分別定義兩個變數並給予賦值 變...