内存类型

C# struct 结构体

ぃ、小莉子 提交于 2020-01-15 00:52:51
参考: https://blog.csdn.net/zeroflamy/article/details/52081462 https://www.w3cschool.cn/csharp/csharp-struct.html 1、C# 结构的特点 1. C#中struct结构体是一个特殊的存在,值类型、栈内拷贝(值类型栈内拷贝决定了struct许多使用特点类似int)。 2. C# 中的结构与传统的 C++ 中的结构不同。C# 中的结构有以下特点: (1)结构可带有方法、字段、索引、属性、运算符方法和事件。 (2)结构可定义构造函数,不能定义析构函数。但不能定义默认构造函数。默认构造函数是自动定义的,且不可改变。 (3)与类不同,结构不能继承其他的结构或类。也不能作为其他结构或类的基础结构。 (4)结构可实现一个或多个接口。 (5)结构成员不能指定为 abstract、virtual 或 protected,这三个关键词都与继承有关,结构不能继承。 (6)当使用 new 创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 new 即可被实例化。 如果不使用 new,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。(栈内分配内存,也就不需要使用new在堆上分配内存)。 2、类和结构的区别 (1)类是引用类型,结构是值类型。 (2)结构不支持继承。

C++基础入门(数据类型)

北城以北 提交于 2020-01-14 10:52:19
数据类型 整型 sizeof关键字 实型(浮点数) 字符型 转意字符 字符串 布尔类型 数据的输入 C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存 。 整型 作用 :整型变量表示的是 整数类型 的数据 C++中能够表示整型的类型有以下几种方式, 区别在于所占内存空间不同 : 数据类型 占用空间 取值范围 short(短整型) 2字节 (-2^15 ~ 2^15-1) int(整型) 4字节 (-2^31 ~ 2^31-1) long(长整形) Windows为4字节,Linux为4字节(32位),8字节(64位) (-2^31 ~ 2^31-1) long long(长长整形) 8字节 (-2^63 ~ 2^63-1) sizeof关键字 **作用:**利用sizeof关键字可以 统计数据类型所占内存大小 语法: sizeof( 数据类型 / 变量) 示例: int main ( ) { cout << "short 类型所占内存空间为: " << sizeof ( short ) << endl ; cout << "int 类型所占内存空间为: " << sizeof ( int ) << endl ; cout << "long 类型所占内存空间为: " << sizeof ( long ) << endl ; cout <<

重新认识C语言的指针(上)

◇◆丶佛笑我妖孽 提交于 2020-01-13 09:10:22
​ 独创性并不是首次观察某种新事物,而是把旧的、很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 —尼采 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!!! 序言  指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。 为什么要学习指针?  有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子 Object obj= new Object();Object sec= obj;sec = new Object();  如果你去仔细研究他们的行为,就会发现 obj, sec 都只是一个指向对象的东西,可以为空,也可以修改指向,所以它们其实都是指针,只是 Java 的教材里面不在去提这东西而已,具体原因看我后面讲解便知道了。 ​ 继续说为什么学习指针,为什么学习指针就必须要说到指针的优点了。

【go】golang中置new()函数和make()函数的区别

痞子三分冷 提交于 2020-01-13 03:29:02
Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives),其功能相似,却有本质区别。 1、new 官方文档 // The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that type. func new(Type) *Type 翻译如下: 内建函数 new 用来分配内存,第一个参数是一个类型,不是一个值,返回值是一个指向分配零值的指针 new和其他语言中的同名函数一样,new(t)分配了零值填充的类型为T内存空间,并且返回其地址,即一个*t类型的值。 返回的永远是类型的指针,指向分配类型的内存地址 它并不初始化内存,只是将其置零。*t指向的内容的值为零(zero value)。注意并不是指针为零。 2、make 官方文档 //The make built-in function allocates and initializes an object //of type slice, map, or chan (only). Like new, the

Python变量理解

强颜欢笑 提交于 2020-01-13 03:13:04
变量进阶(理解) 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据的地址 ,就叫做 引用 使用 id() 函数可以查看变量中保存数据所在的 内存地址 注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用 变量 不再 对之前的数据引用 变量 改为 对新赋值的数据引用 1.2 变量引用 的示例 在 Python 中,变量的名字类似于 便签纸 贴在 数据 上 变量可以理解为是一个标签,当与对象关联时,其实是变量这个标签拴在了那个对象上了,一个标签只能拴在一个对象上且还是栓的最新的那个对象; 1.3 函数的参数和返回值的传递 在 Python 中,函数的 实参 / 返回值 都是是靠 引用 来传递来的 def test(num): ​ print("-" * 50) print("%d 在函数内的内存地址是 %x" % (num, id(num))) ​ result = 100 ​ print("返回值 %d 在内存中的地址是 %x" % (result, id(result))) print("-" * 50) ​

关于Mach-O类型文件那点事

白昼怎懂夜的黑 提交于 2020-01-12 22:14:12
Mach-O文件简介 Mach-O是一种文件格式,是Mach Object文件格式的缩写。 它通常应用于可执行文件,目标代码,动态库,内核转储等中。 Mach-O作为大部分基于Mach核心的操作系统所使用。 如:NeXTSTEP,Darwin和Mac OS X等系统使用这种格式作为其原生可执行文件,库和目标代码的格式。 在NeXTSTEP和Mac OS X中,可以将多个Mach-O文件组合进一个多重架构二进制文件中,以用一个单独的二进制文件支持多种架构的指令集。这种称为胖二进制文件(即:Fat binary文件)。 Mach-O文件类型众多,常见的一些Mach-O文件类型如下: MH_OBJECT 目标文件,平时.o结尾的文件 MH_EXECUTE 可执行文件,我们平时编译后的包中的执行文件 MH_DYLIB 一些动态库,该文件夹下很多/usr/lib/xxx.dylib MH_DSYM 符号文件,编译成功后XXX.app.dSYM Mach-O文件结构布局 Mach-O主要有三部分组成: Header 部分主要描述当前Mach-O文件什么架构,是否Fat二进制文件,CUP类型等等; Load commands 部分主要描述: 1.Mach-O文件中在虚拟内存中空间是如何分配的,从哪个内存地址开始到哪个内存地址结束。 2.不同段在Mach-O文件中的位置,大小分布。 Data

C++多线程——原子操作atomic

半世苍凉 提交于 2020-01-11 22:36:37
1. 原子操作 1.1 示例 原子操作 是个不可分割的操作。 在系统的所有线程中,你是不可能观察到原子操作完成了一半这种情况的; 它要么就是做了,要么就是没做,只有这两种可能。 不使用原子操作: # include <iostream> # include <thread> # include <atomic> using namespace std ; long num = 0 ; void addnum ( ) { for ( int i = 0 ; i < 100000 ; i ++ ) num ++ ; //不对全局变量进行互斥访问 } int main ( ) { int nthreads = 2 ; thread t [ nthreads ] ; for ( int i = 0 ; i < nthreads ; i ++ ) t [ i ] = thread ( addnum ) ; for ( auto & th : t ) th . join ( ) ; cout << num << endl ; return 0 ; } 输出结果: 最终结果为 109515 ,这个结果小于 200000 ,说明在对全局变量进行写的时候出现了下面的情况: 明明加了两次,但是因为访问不是互斥的,从而导致实际的值小。 使用原子操作可以避免这种情况的发生

[The RUST Programming Language]Chapter 4. Understanding Ownership (1)

无人久伴 提交于 2020-01-11 15:19:38
Understanding Ownership What Is Ownership? 什么是所有权? Ownership Rules 所有权规则 Variable Scope 变量作用域 The `String` Type `String`类型 Memory and Allocation 内存分配 Ways Variables and Data Interact: Move 变量和数据的交互方法:移动 Ways Variables and Data Interact: Clone 变量和数据的交互方法:克隆 Stack-Only Data: Copy 栈数据:复制 Ownership and Functions 所有权和函数 Return Values and Scope 返回值和作用域 所有权是Rust最独特的一个特性,它可以让Rust在没有垃圾回收的情况下保证内存的安全性。因此,理解所有权在Rust中的工作原理是非常重要的。在本章中,我们将讨论所有权和几个与它相关的特性:借用、切片以及Rust如何在内存中存放数据。 What Is Ownership? 什么是所有权? Rust的核心特性是 ownership 所有权,尽管这个特性非常直白,易于解释,但它对Rust这门语言有非常深远的影响。 所有程序在运行时,都须要管理它们使用到的内存。有些语言有垃圾回收的机制

值类型和引用类型

大兔子大兔子 提交于 2020-01-11 08:21:11
在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。 常见的值类型数据有:整值型(整形,浮点型,十进制型),布尔类型,枚举类型; 引用类型有:接口,数组,Object类型,类,委托,字符串,null类型。 在C#中每种类型的存储方式有两种:1)分配在托管栈中;2)分配在托管堆中; 内存的分配有CLR管理(即公共语言运行时),这两种方法的区别是: 1)分配在托管栈中的变量会在创建它们的方法返回时自动释放,例如在一个方法中声明Char型的变量UserInput=C,当实例化它的方法结束时,UserInput变量在栈上占用的内存就会自动释放; 2)分配在托管堆中的变量并不会在创建它们的方法结束时释放内存,它们所占用的内存会被CLR中的垃圾回收机制释放。 看下面的代码: 1 static void Main(string[] args) 2 { 3 //当nStudent声明并赋值是,这时在托管栈上就会开辟一块内存来存储nStudent的值,当实例化nStudent的Main()方法结束时, 4 //nStudent在托管栈上占用的内存会自动释放。 5 int nStudent = 0; 6 //当声明strStuName时,这个时候“小明”存储在托管堆中,而托管栈中存储的是strStuName指向的引用。 7 string strStuName =

day05_数组

こ雲淡風輕ζ 提交于 2020-01-10 23:16:20
容器概念 容器: 是将多个数据存储到一起,每个数据称为该容器的元素。 生活中的容器 :水杯,衣柜,教室 数组概念 数组: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致 数组的特点: 数组是一种引用数据类型 数组当中的多个数据,类型必须统一 数组的长度在程序运行期间不可改变 数组的初始化 在内存当中创建一个数组,并且向其中赋予一些默认值就是数组的初始化 两种常见的初始化方式: 动态初始化(指定长度): 在创建数组的时候,直接指定数组当中的数据元素个数。 静态初始化(指定内容): 在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。 数组的定义 动态初始化数组 格式: 数据类型[] 数组名称 = new 数据类型[数组长度]; 数组定义格式详解: 数据类型: 创建的数组容器可以存储什么数据类型。 [ ] : 表示数组。 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。 new:关键字,创建数组使用的关键字。 数据类型: 创建的数组容器可以存储什么数据类型。 [长度]:数组的长度,表示数组容器中可以存储多少个元素。 注意: 数组有定长特性,长度一旦指定,不可更改。和水杯道理相同,买了一个2升的水杯,总容量就是2升,不能多也不能少。 举例 // 创建一个数组,里面可以存放300个int数据 int[] arrayA = new