1 天前 / TIGEEB
系列导读本系列基于 64 位平台、1Page=8KB 今天我们开始拉开《Go 语言轻松系列》第二章「内存与垃圾回收」的序幕。 关于「内存与垃圾回收」章节,大体从如下三大部分展开: 知识预备 ( 为后续的内容做一些知识储备),知识预备包括 指针的大小 TCMalloc 内存分配原理 Go 内存设计与实现 Go 的垃圾回收原理 本文前言 第一部分知识预备的第一个知识点指针的大小。 为什么指针的大小会作为一个知识点呢? 因为后续内存管理的内容会涉及一些数据结构,这些数据结构使用到了指针,同时存储指针的值是需要内存空间的,所以我们需要了解指针的大小...
14 天前 / KevinYan
大家好呀,今天网管想在这篇文章里好好跟大家聊一下 Go 语言指针这个话题,相较于 C 而言,Go 语言在设计时为了使用安全给指针在类型和运算上增加了限制,这让 Go 程序员既可以享受指针带来的便利,又避免了指针的危险性。除了常规的指针外,Go 语言在 unsafe 包里其实还通过 unsafe.Pointer 提供了通用指针,通过这个通用指针以及 unsafe 包的其他几个功能又让使用者能够绕过 Go 语言的类型系统直接操作内存进行例如:指针类型转换,读写结构体私有成员这样操作。
101 天前 / apeng
详解 C++ 11 中的智能指针详解 C++ 11 中的智能指针 C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念。这里不置贬褒,手动分配内存与手动释放内存有利也有弊,自动分配内存和自动释放内存亦如此,这是两种不同的设计哲学。有人认为,内存如此重要的东西怎么能放心交给用户去管理呢?而另外一些人则认为,内存如此重要的东西怎么能放心交给系统去管理呢?在 C/C++ 语言中,内存泄露的问题一直困扰着广大的开发者...
223 天前 / 公众号_coredump
智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr:独占资源所有权的指针。std::shared_ptr:共享资源所有权的指针。std::weak_ptr:共享资源的观察者,需要和 std::shared_ptr 一起使用,不影响资源的生命周期。std::auto_ptr 已被废弃。 std::unique_ptr 简单说,当我们独占资源的所有权的时候,可以使用 std::unique_ptr 对资源进行管理——离开 unique_ptr 对象的作用域时,会自动释放资源。这是很基本的 RAII 思想。 std::unique_ptr 的使用比较简单,也是用得比较多的智能指针。这里直接看例子。 使用裸指针时,要记得释放内存。
251 天前 / 高飞
一:背景 1. 讲故事高级语言玩多了,可能很多人对指针或者汇编都淡忘了,本篇就和大家聊一聊指针,虽然 C#中是不提倡使用的,但你能说指针在 C#中不重要吗?你要知道 FCL 内库中大量的使用指针,如 String,Encoding,FileStream 等等数不胜数,如例代码: private unsafe static bool EqualsHelper(string strA, string strB) { fixed (char* ptr = &strA.m_firstChar) { fixed (char* ptr3 = &strB.m_firstChar) { char* ptr2 = ptr; char* ptr4 = ptr3; ...
253 天前 / 风来风往风伤(TiAmo)
说到指针,估计还是有很多小伙伴都还是云里雾里的,有点“知其然,而不知其所以然”。但是,不得不说,学了指针,C 语言才能算是入门了。指针是 C 语言的精华,可以说,对对指针的掌握程度,直接决定了你 C 语言的编程能力。 在讲指针之前,我们先来了解下变量在内存中是如何存放的。 在程序中定义一个变量,那么在程序编译的过程中,系统会根据你定义变量的类型来分配相应尺寸的内存空间。那么如果要使用这个变量,只需要用变量名去访问即可。 通过变量名来访问变量,是一种相对安全的方式。因为只有你定义了它,你才能够访问相应的变量。
260 天前 / hyper0x
点击上方蓝色“Go 语言中文网”关注我们,领全套 Go 资料,每天学习Go语言 Cgo 允许 Go 程序调用 C 库或其他暴露了 C 接口的库。正是如此,这也成为 Go 程序员工具箱的重要组成部分。 使用 Cgo 可能会比较棘手,特别是在 Go 和 C 代码中传递指针和回调函数时。这篇文章讨论了一个端到端当例子,包含了如下几方面: Cgo 的基本使用,包括链接一个传统的 C 库到 Go 二进制文件中。从 Go 语言中传递 struct 到 C 语言中。传递 Go 函数到 C 程序中,并安排 C 程序在随后调用它们。
320 天前 / Jackeyzhe
在了解了 Rust 中的所有权、所有权借用、生命周期这些概念后,相信各位坑友对 Rust 已经有了比较深刻的认识了,今天又是一个连环坑,我们一起来把智能指针刨出来,一探究竟。 智能指针是 Rust 中一种特殊的数据结构。它与普通指针的本质区别在于普通指针是对值的借用,而智能指针通常拥有对数据的所有权。在 Rust 中,如果你想要在堆内存中定义一个对象,并不是像 Java 中那样直接 new 一个,也不是像 C 语言中那样需要手动 malloc 函数来分配内存空间。Rust 中使用的是 Box::new 来对数据进行封箱,而 Box 就是我们今天要介绍的智能指针之一。
350 天前 / 编程技术宇宙
1 栈里的对象 "构造完毕,请睁开眼吧!",迷迷糊糊中,听着这个声音,我睁开了眼睛,一位小哥映入眼帘。 “你是谁?我是谁?这又是什么地方?”,我的大脑一片空白。“你是一个 C++ 对象,这里是栈空间。我是创建你的线程,你先待着,一会儿会用到你,拜~”“唉,等一下。..”,还没等我回过神,小哥已经走远。 环顾四周,这个叫栈的地方,有好多好多的对象,大小不一,不远处还有一个巨无霸对象足足有好几千字节。“哇!好大一个对象!”,我不禁发出了惊叹。 “一看就是没见过世面的,这才多小的个头,就在那大呼小叫的”,突然传来一个声音。
386 天前 / 阿伟me
uintptr 和 unsafe普及uintptr在Go的源码中uintptr的定义如下: /* uintptr is an integer type that is large enough to hold the bit pattern of any pointer.从英文注释可以看出 uintptr是一个整形,它的大小能够容纳任何指针的位模式,它是无符号的,最大值为:18446744073709551615,怎么来的,int64最大值 * 2 +1*/type uintptr uintptr位模式:内存由字节组成.每个字节由8位bit组成,每个bit状态只能是0或1.所谓位模式,就是变量所占用内存的所有bit的状态的序列 指针大小:一个指针的大小是多少呢?在32位操作系统上,指针大小是4个字节...
473 天前 / GO语言中文网
点击上方蓝色“Go语言中文网”关注我们,设个星标,每天学习Go语言 定义 了解指针之前,先讲一下什么是变量。 每当我们编写任何程序时,我们都需要在内存中存储一些数据/信息。数据存储在特定地址的存储器中。内存地址看起来像0xAFFFF(这是内存地址的十六进制表示)。 现在,要访问数据,我们需要知道存储它的地址。我们可以跟踪存储与程序相关的数据的所有内存地址。但想象一下,记住所有内存地址并使用它们访问数据会有非常困难。这就是为什么引入变量。 变量是一种占位符,用于引用计算机的内存地址,可理解为内存地址的标签。
510 天前 / cultus
一、写在前面的话:在介绍Go的指针之前,我们需要先介绍下,指针是什么?为什么我们需要指针?(备注:这里指的是原始指针。) 1.指针是什么? 首先指针是一个变量,全名叫做指针变量,只不过这个变量里面存储的值是一个地址而已。所以指针,哪怕是空指针,都是有地址的,因为变量都是有地址的。例子如下: Output: 从下面的输出,我们可以看出空指针a的地址是存在,在a指向b之前,指针a的值为nil,指向b之后,数值变成了变量b的地址,而对a 做操作*a的话,数值为变量b对应的数值10。
562 天前 / 豌豆花下猫
点击上方蓝字“Python猫”,免费获得一个公众号 花下猫语:本文是学习群内樱雨楼小姐姐的投稿。之前已发布过她的一篇作品《当谈论迭代器时,我谈些什么?》,大受好评。本文依然是对比 C++ 与 Python,来探讨编程语言中极其重要的概念。祝大家读有所获,学有所成! 樱雨楼 | 原创作者 豌豆花下猫 | 编辑润色 0 引言指针(Pointer)是 C、C++ 以及 Java、Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念。
583 天前 / DGuco
c++中最大的问题就是内存管理问题也就是指针,当一个指针在程序中到处传的时候,经常会出现多次销毁,或者用到一个已经被释放的指针(野指针),特别是在多线程中这种情况更加难以处理,根本不知道什么时候会在哪个线程中被释放,虽然c++11中的智能指针有效的解决了这个问题,在很大程度上简化了内存管理的难度,但是使用不当还是会导致程序崩溃,比如你在使用的时候把一个智能指针reset或者把nullptr赋给了目标智能指针,这个时候裸指针起最根本的问题还是会暴露出来,究其根本还是智能指针的设计导致的。
691 天前 / 承香墨影
一、前言链表是基本的数据结构之一,它与数组不同,数组在内存中存储,需要一块连续的内容空间来存储,对内存的要求比较高。例如我们需要 100MB 大小的数组,内存中就必须有一段连续的 100MB 的内存空间,否则就会出现 OOM。 而链表则不同,链表不需要一块连续的内存空间。它是通过“指针”,将一组零散的内存块串联起来。所以完全不用担心连续内存空间以及扩容等问题。 数据结构中的链表,一直是面试的常客,尤其是它引申出来的一些面试题,其实只要掌握了其中的技巧,很多同类型的链表题,思路都是相似的。