• 締切済み

変数の文字列を書き換えた時、メモリ上のアドレスは変わりますか?

変数の文字列を書き換えた時、メモリ上のアドレスは変わりますか? zval構造体上のエントリ、及び、実際のメモリにおけるアドレス、その両方についてお教え下さい。 // 例 <?php $a = 'aa'; $a = 'bb'; ?> 知りたい点は、メモリの節約や実行速度の観点で何らかの工夫が可能なのかどうかという事を考えるためヒントです。 ※「copy on write」に関しては理解しています。

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

C++辺りから転向してきた方でしょうか? 結論から先に言うなら「$aが参照しているメモリのアドレスなら変わる」だと思いますが、多分C++やCのポインタ構造を基準にすると絶対語弊があります。 変数管理回りを知りたいなら、参照URLにあるカテゴリ「PHP変数管理を理解する」などが参考になるかと。 PHPはメモリ節約などはあんまり考えなくても良いように設計されています。 ある繰り返しの中でオブジェクトを毎回newするより一つのオブジェクトを使いまわす、程度の工夫はやった事ありますが、文字列管理レベルでは全く気にしたこと無いですね。 (最も、そのオブジェクトの管理を行う参考として上記の例を挙げられたのだとは思いますが。 バージョンで違いますが、PHP5以降ではclone演算子を使わないかぎり全て参照となるのでこの辺の話はさらに無縁なんですよね)

参考URL:
http://www.cpa-lab.com/tech/
helonpa
質問者

補足

回答ありがとうございます。 長らく気付きませんでして、申し訳ありませんでした。 > C++辺りから転向してきた方でしょうか? COBOLとCとJavaをかじってからPHPに流れ着いた者です。 > 結論から先に言うなら「$aが参照しているメモリのアドレスなら変わる」だと思います PHPでメモリのアドレスと言っても、ちょっとトンチンカンだったかもしれませんね。 スミマセン。 JavaですとStringに対してStringBufferのように、追記に配慮されたクラスが ありますが、PHPではどうしたもんかと思ったのがそもそもです。 > 変数管理回りを知りたいなら、参照URLにあるカテゴリ「PHP変数管理を理解する」などが参考になるかと。 そちらのサイト、質問をした当時、読んでました。 が、質問させて頂いた点は分からず・・・。

関連するQ&A

  • Excelの文字列関数について

    Excelの文字列関数について こんにちは。Excel2007を使用しています。 先日、こちらで質問させていただいた【QNo.5785641】の続きになるのですが・・・ セルの中にある特定の文字が含まれている場合は、ある文字の後ろの数値を抽出したいという質問で、 例えば、セルA1に『AA-11 $100.00』、A2に『BB $ 95.00』と入力されている場合、『AAという文字が含まれている場合はB1に$マークの後ろの数値を抽出、BBという文字が含まれている場合はC1に$マークの後ろの数値を抽出する』というものを関数を使用して作りたいというものに対し、 =IF(COUNTIF(A1,"*AA*")=1,RIGHT(A1,LEN(A1)-FIND("$",A1)),"") =IF(COUNTIF(A1,"*BB*")=1,RIGHT(A1,LEN(A1)-FIND("$",A1)),"") という回答をいただきましたが、さらに追加で質問です。 例えば、セルA1に『AA-11 $100.00 aabbcc』、A2に『BB $ 95.00 abc』というように、抽出したい数値の後ろにも文字が入力されている場合はどのようにしたらよいのでしょうか? 宜しくお願いします。

  • 変数など厳密なプログラムが書きたいのですが、どうすればよいでしょうか?

    PHPで関数の引数に渡すとき、以下のように$aaを$aとしてしまった場合に 関数内の$idは値がありませんが、関数内でこれを検出することができるのでしょうか? Perlなら use strict;とし、my等で定義されていない変数はすべて警告表示されますが、PHPはスルーです。 変数など厳密なプログラムが書きたいのですが、どうすればよいでしょうか? $aa = 1; test($a) function test($id){ ... }

    • ベストアンサー
    • PHP
  • 変数がダブる?

    条件で振り分ける為変数を利用しようとしています。 ○○.cgi?mode=view&a=1 と言う感じで○○.cgiにアクセスし、if文で"aが1ならAAを表示、2ならBBを表示、3なら~"と言う感じで振り分けようと考えています。 しかし、うまく振り分けが出来ないのでおかしいなと思いhtml部分に$aを表示してみました。すると、変数の内容がダブってしまっているのです。(1なら11、viewならviewviewと言う感じ) 全ソースを出すことも出来ないので抽象的な問題になりますが、どのあたりをチェックする必要があるでしょうか? ちなみに変数の名前が他のものと一緒になっているのかとも考えて変数名も変えてみましたが、変化無しです。 よろしくお願いします。

    • 締切済み
    • CGI
  • ポインタ変数を変数に渡す方法

    (int * 型)ポインタ変数に代入されたアドレスを、(普通の)int 型変数に代入したいのですが、どのようにするのが正しいのでしょうか。 想定しているケースは、与えられたメモリ番地に対して、アドレスオフセットを加えるなどの操作を施して「補正アドレス」を生成し、メモリアクセスを行う、というような特殊な操作を実現するような場合です。 ※ メモリ番地がポインタ宣言で与えられる、という制約があります。 以下サンプルプログラムを書きました。組み込み系のプログラムを記述していますが、これで正しいでしょうか。 unsigned int *p, *p1; // ポインタ変数宣言 unsigned int value; p= (unsigned int *)0x00001F00; // メモリの0x1F00番地 value = p; // <-- ここが心配 value |= 0xCC << 16; // 与えられたアドレスから value &= 0x4 << 12; // 「補正アドレス」生成 p1 = (unsigned int *)value; *p1 = 0xA5A5_A5A5; // 「補正アドレス」にA5A5... をライト C言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。

  • <excel:VBA>変数を使って簡略化したい

    google検索してなんとか自力で作ったVBAを下記に貼りました。 きちんと動作はするのですが、せっかくなので変数を使って簡素化し、 データが多くても動作が速くなるようにしたいのです。 いろいろ試しましたが、変数の使い方の知識が乏しく、うまくいきませんでした。 変数としたいのは■マークの2箇所になると思います。 詳しい方、力を貸していただけないでしょうか。 どうぞよろしくお願いいたします。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Sub オートフィルタ貼付作業() With Sheets("データ").Range("A3") Application.ScreenUpdating = False Range("AA3:EK3").AutoFilter .AutoFilter Field:=1, Criteria1:="1" ’■Fieldが1ずつ増えていく Range("AA3").Copy Range("Z3") ’■AA3が1列ずつ右へずれていく .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter Range("AA3:EK3").AutoFilter .AutoFilter Field:=2, Criteria1:="1" Range("AB3").Copy Range("Z3") .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter ~~~~~~~~~~~~ 115列分のデータがあり 下記まで同じようにつづきます ~~~~~~~~~~~~ Range("AA3:EK3").AutoFilter .AutoFilter Field:=115, Criteria1:="1" Range("ek3").Copy Range("Z3") .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter End With Application.ScreenUpdating = True Sheets("貼付").Activate Cells.Columns.AutoFit End Sub ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

  • アウトルックエクスプレスのアドレス帳変更

    アドレス帳に入っている数人のアドレスのうち 例えば***@aa.co.jpというのを @bb.co.jpというようにaをbに一気に置き換えることはできますか?

  • bashで配列の個数部分を変数で指定するとエラーに

    bashで配列の個数部分を変数で指定するとエラーになってしまいます。 #!/bin/bash aa[0]="a0" aa[1]="a1" aa[2]="a2" bb[0]="b0" bb[1]="b1" bb[2]="b2" bb[3]="b3" cc[0]="c0" cc[1]="c1" cc[2]="c2" cc[3]="c3" cc[4]="c4" list=(aa bb cc) for i in ${list[@]} do eval echo "$i=\${#$i[*]}" n="\${#$i[*]}" mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" eval echo "$mes \${$i[$(( ${RANDOM} * 3 / 32768 ))]}" done $ . list-test.sh aa=3 a1 a2 bb=4 b2 b2 cc=5 c0 c2 上記の下記箇所の「各配列の個数部分の3」をイメージ的には変数で指定したいです。 mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" ↓ mes="\${$i[$(( ${RANDOM} * $n / 32768 ))]}" $nのように指定すると、下記のエラーになってしまいます。 >bash: 29205 * ${#aa[*]} / 32768 : 構文エラー: オペランドが予期されます (エラーのあるトークンは "${#aa[*]} / 32768 ") ${n}や\$nや($n)など色々試してみたのですが、解決できませんでした。 恥ずかしながら、どなた様かご教授ねがえませんでしょうか

  • PHPの変数の渡し方

    現在以下のような位置関係のファイルでa.phpからb.phpに変数を渡したいのですが、うまく行きません。 ├dir1 │ └a.php └dir2   └b.php a.php <?php public function a(){ $value = "test"; } ?> b.php <?php public funcition b(){ print($value); } ?> phpについてwebで調べ、a.phpで$valueをglobalにしてb.phpでは 関数内でinclude('../dir1/a.php')を記述して$GLOBALS['$value']を 使ってみたのですが、うまく値がとれませんでした。 a.phpで変数をテンプレートに設定して $smarty->Set('Value', $value); それをb.phpで取得しようとしたのですが $smarty->getTemplateVars(Value); 取得する事ができませんでした。 同じようにgeTTemplateVarsを使って別のphpでは取得出来たりするのですが、 このsmartyのスコープ?というのもわかりません。 phpScheduleItというスケジュール管理のパッケージを触っていて、 php自体初めてで深い実装が全て追えていません。 勉強不足で申し訳ないのですが、何かヒントとなる事がありましたらご教示頂けますでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • VBAのパスの取得について

    excelでマクロをVBAで組み、excelが現在置かれているところのパスを取得したのですが たとえばCのaaというファイルのbbところにおいて実行すると変数aに C:\aa\bb を取得することができました。 このパスの最後に\をつけて C:\aa\bb\ にしたいのですがどの書けば変数aに\を追加できるのでしょうか?

  • 複数メールアドレスのチェック

    現在、phpにてメールフォームを制作していますが、送信先に複数メールアドレスを指定した際の正規表現でチェックしたいと思っているのですが、全く分かりません。 正規表現で「preg_match("/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i",$value)」としていますが、「aaa@aa.aa,bbb@bb.bb」などカンマでメールアドレスを複数(1~5アドレスを想定)区切った場合、エラーが出てしまいます。 どのようにしたら、うまくいくか教えていただけないでしょうか? 色々と調べましたがわかりません。 大変申し訳ないですが、よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう