关于move

procedure TForm4.Button1Click(Sender: TObject);
var
  //动态数组
  bytes1,bytes2: TBytes;
  //静态数组
  bytes3,bytes4: array[0..5] of Byte;
  i: Integer;
  abc: string;
begin
  //初始化赋值
  abc := ‘ab好‘;
  bytes1 := WideBytesOf(abc);
  for I := 0 to 5 do
  begin
    bytes3[I] := I;
  end;

  {
    根据我的猜测delphi内部最终是拿到了数组首元素的内存编号
    (静态数组变量本身就是,动态数组的话传递首元素的值(要解密得解开汇编代码))
    结论:最终move函数的前两个参数的内部的汇编代码,可能就是拿到堆中数据首元素的内存编号
  }

  //1.动态数组复制到动态数组(规定:前两个参数传递数组首元素的值)
  SetLength(bytes2, Length(bytes1));
  Move(bytes1[0], bytes2[0], Length(bytes1));

  //2.动态数组复制到静态态数组(两种写法都可以为了与动态数组统一,推荐用[0]的方法)
  Move(bytes1[0], bytes3[0], Length(bytes1));
  //Move(bytes1[0], bytes3, Length(bytes1));

  //3.静态数组复制到静态态数组(两种写法都可以为了与动态数组统一,推荐用[0]的方法)
  Move(bytes3[0], bytes4[0], Length(bytes3));
  //Move(bytes3, bytes4, Length(bytes3));
end;

procedure testByte(b: Byte);
var
  pp: Pointer;
begin
  //如果是普通函数的话,你会发现是值传递,但是move函数的原型 windows下是汇编,所以不会按常规出牌.
  //与Pointer(@b1[0]);不同
  pp := Pointer(b);
end;

procedure TForm4.Button2Click(Sender: TObject);
var
  bs: TBytes;
begin
  bs := BytesOf(‘abc‘);
  testByte(bs[0]);
end;

procedure TForm4.Button3Click(Sender: TObject);
var
  b1: TBytes;
  p1,p2,p3,p4: Pointer;
begin
  b1 := BytesOf(‘abc‘);

  p1 := Pointer(b1);//栈中内存的值即堆中的地址
  p2 := Pointer(@b1[0]);//首元素的地址就是变量本身,同Pointer(b1)一样(我猜测move函数让传入 b1[0],其实他内部就是拿到堆中数据首元素的地址)
  p3 := Pointer(b1[0]);//首个元素的值转成了pointer类型
  p4 := Pointer(Pbyte(b1)^);//首元素的值转成了pointer类型.$61 = 1 + 16 * 6 = 97(a)
end;

知识点1:

静态数组与动态数组的内存存储是不同的,静态数组仅存在于栈内 或 仅存在于堆内,就是说是没有 栈中指针 堆中数据这个说法的。

而动态数组是栈中存变量指针,堆中存数据的。

知识点2:

bytesof是把字符串中的值转成ascii码表中的10进制值来表示的,因为毕竟Byte是整型嘛;

wideBytesof 是转成双字节的,若是英文的话,双字节中的第一个字节存值,第二个字节填充为0;中文的话 就是unicode编码 两个字节肯定都有值的。

知识点3:

静态数组为什么这两句写法都行,move函数的2个参数是需要传递数据的首元素的值,我猜测最终的目的是拿到堆中数据首元素的内存编号。对于静态数组而言,数组变量本身就是数据的起始指针。

而对于动态数据而言,bytes1(栈中内存块数据--也可以叫做栈中指针),@bytes1[0] 就是堆中数据的起始地址了;元素首元素的地址 就是 变量本身;

知识点4:

move其实也是copy内存,我猜想copy的话 应该比 转移更快的原因,因为转移的话 就是 拿走后 还得销毁 浪费时间。因为出栈后 程序会自动销毁,所以干嘛不复制呢。

关于群里的讨论:太长略了,结论:

无论静态数组还是动态数组都这样玩(带[0]),保证没错。

Move(bytes1[0], bytes2[0], Length(bytes1));

时间: 2024-10-26 19:31:43

关于move的相关文章

283. Move Zeroes

Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements. For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0]. Note: You

move语义笔记

 class A { public:     A( A&&a):m_a(a.m_a)     {         std::cout<<"move contruct:"<<m_a<<endl;     }     A(const A&a):m_a(a.m_a)     {         std::cout<<"copy contruct:"<<m_a<<endl;   

Move Zeroes

package cn.edu.xidian.sselab.array; /** * titile:Move Zeroes * content: * Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements. * For example, given nums = [0, 1, 0, 3, 1

oracle lob move tablespace

oracle 大对象移动表空间 ALTER INDEX GHSJ_JCSJ.SYS_IL0000129600C00012$$ REBUILD  TABLESPACE GHSJ_JCSJ ORA-02327: cannot create index on expression with datatype LOB 将lob对象对应的列移动到相应的表空间,会自动创建之前的索引 ALTER TABLE  ghsj_jcsj.B_REPORT_HIS MOVE LOB (FILE_PATH) STORE

LeetCode: 283 Move Zeroes(easy)

题目: Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements. For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0]. Note:

sharepoint 2013:活动目录迁移用户后,在sharepoint中move 用户 powershell

Get-SPUser -web http://wfe1  | fl    (查看该网站集中的账户) $user = Get-SPUser -web http://wfe1 -Identity 18   (将id为18的账户赋予变量$user ,不用变量下面一条语句会失败,18也可以用用户名取代) Move-SPUser -IgnoreSID -Identity $user -NewAlias 'test\sale02'   (将该账户迁移为新账户,可以在同一个域中,也可以不同域) 该操作在web

JS运动组件, move.js

move.js function getStyle(obj, name){ return obj.currentStyle?obj.currentStyle[name]:getComputedStyle(obj, false)[name]; }; function move(obj, json, options){ options=options||{}; options.type=options.type||'buffer'; options.time=options.time||700; v

LeetCode(283): Move Zeros

Move Zeros: Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].

LeetCode: Move Zeroes

Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements. For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0]. Note: You

各种封装----move框架

运动框架 html <div id="div1"></div> js: window.onload=function(){ var oDiv=document.getElementById('div1'); oDiv.onclick=function(){ move(oDiv,{left:300}); }; }; 使用:move() function move(obj, json, options){    options=options || {};    v