结构体中的指针和值有什么区别?

2024-02-16

给定以下结构:

type Exp struct {
  foo int,
  bar *int
}

在结构中使用指针或值时,性能有何区别?是否有任何开销或者这只是 Go 编程的两个流派?

我会使用指针来实现链式结构,但这是否是我们必须在结构中使用指针以获得性能的唯一情况?

PS:在上面的结构中,我们讨论的是一个简单的 int,但它可以是任何其他类型(甚至是自定义类型)


使用对您的程序功能最有用的形式。基本上,这意味着该值是否有用nil,然后使用指针。

从性能角度来看,复制原始数字类型总是比取消引用指针更有效。即使更复杂的数据结构如果小于一两个缓存线(对于 x86 CPU 来说,小于 128 字节是一个很好的经验法则),复制速度通常仍然更快。

当事情变得更大时,您需要对性能是否担心进行基准测试。 CPU 是very复制数据的效率很高,并且涉及很多变量,这些变量将决定数据的局部性和缓存友好性,这实际上取决于程序的行为以及您使用的硬件。

如果您想更好地了解内存和软件如何交互,这是一个很棒的系列文章:《每个程序员都应该了解的内存知识》 http://lwn.net/Articles/250967/.

总之,我告诉人们根据程序的逻辑选择是否使用指针,稍后再担心性能。

  • 如果需要传递要修改的内容,请使用指针。
  • 如果需要确定某些内容是否未设置/为零,请使用指针。
  • 如果您使用的类型具有带有指针接收器的方法,请使用指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体中的指针和值有什么区别? 的相关文章

  • 如何在 Visual Studio Code 中为 Golang 启用竞争检测器?

    我搜索了很多网页来找到我应该放入哪个短语settings json在 VS Code Golang 扩展 由 Microsoft 发布 中添加构建标志 在我的例子中是竞赛检测器 I added go buildFlags race 在扩展名
  • 在 C++ 中一般将“可选”字段封装在结构中的最佳方法?

    我有很多具体结构 我想将字段指定为可选 存在或不存在 只是想知道人们有什么想法来实现这一目标 这是一个示例结构 字段也可以是其他结构 甚至是结构的向量 struct LogonMessage t Header t header this p
  • 将原始结构内容(字节)写入 C 中的文件。对写入的实际大小感到困惑

    基本问题 但我预计这个结构占用 13 个字节的空间 1 个字节用于 char 12 个字节用于 3 个无符号整数 反而 sizeof ESPR REL HEADER 给我 16 个字节 typedef struct unsigned cha
  • 如何在 Go 中表示可选字符串?

    我希望建模一个可以有两种可能形式的值 不存在或字符串 执行此操作的自然方法是Maybe String or Optional
  • 取消用户特定的 goroutine [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个应用程序 网络应用程序 允许用户使用 twitter oauth 登录并提供自动推文删除功能 用户登录到 Web 应用程序后
  • 通过引用传递参数到指针问题

    每次我尝试编译代码时都会收到错误 cannot convert parameter 1 from int to int 测试代码如下所示 void set int val val 10 int main int myVal int pMyV
  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • 无法连接到代理“证书由未知机构签名”

    我正在尝试通过 Kubernetes 部署上的 cloudsql proxy 容器连接到 CloudSQL 实例 我已安装 cloudsql 凭据以及值GOOGLE APPLICATION CREDENTIALS set 但是 我的日志中仍
  • Go 中的 WebP 编码器/解码器

    是否有一个完整的 WebP 编码器和解码器与当前每周 或可分叉 兼容 它的速度与标准 png 相当吗 这个人在 GitHub 上有一个包 其中包含 WebP 的编码器和解码器 https github com chai2010 webp h
  • 是否支持动态变量?

    我想知道Go中是否可以动态创建变量 我在下面提供了一个伪代码来说明我的意思 我将新创建的变量存储在切片中 func method slice make type for i 0 i lt 10 i var variable i i slic
  • nsq 无法通过连接到 nsqlookupd 来消费消息

    我尝试使用 docker compose 来运行 nsq docker compose yml如下 version 3 services nsqlookupd image nsqio nsq command nsqlookupd ports
  • 如何在golang模板上打印JSON?

    我需要在客户端有一个对象 所以我使用 json marshal 将其转换为 JSON 并将其打印到模板中 该对象被打印为转义 JSON 字符串 我期待它是var arr o1 o2 但它是var arr o1 o2 我知道我可以在客户端进行
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • 指向基类的成员指针

    全部 我不明白为什么下面的代码需要强制转换才能工作 有人可以解释一下吗 class Base class Derived public Base class Class public Derived member Derived obj B
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 为什么我不能将一个非 const 指针传递给一个函数,该函数将以对 const 指针的引用作为其参数

    这是一个代码片段 希望能够传达我想要做的事情 void updatePointer const int i i int main int array 5 int arrayPtr array updatePointer arrayPtr r
  • 重新插入通道导致死锁

    我有稳定的入站 作业 流 将其输入到无缓冲通道中 我有一个for range循环来迭代项目并处理它们 如果处理该项目失败 我会将项目重新插入通道中 以便稍后重试 问题是当我将项目重新插入通道时 它陷入僵局 我明白为什么会发生这种情况 处理器
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • reinterpret_cast 为 void* 是否合法

    我在看https en cppreference com w cpp language reinterpret cast https en cppreference com w cpp language reinterpret cast我注
  • 我应该避免在 golang 中使用单例包吗?

    现在我有一个包裹store包含以下内容 package store var db Database func Open url string error open db connection func FindAll model inter

随机推荐

  • C++ 将 float* 转换为 glm::vec3

    如何以表单形式投射浮点数数组float to glm vec3 我以为我以前做过 但我丢失了硬盘 我尝试了一些C风格static cast但我似乎无法让它工作 From float to vec3 float data 1 2 3 glm
  • 枚举*所有*哈密尔顿路径

    我知道以前有人问过这个问题 但我没有在任何帖子中找到答案 有人可以建议我一个枚举图中所有哈密顿路径的算法吗 一点背景知识 我正在研究一个问题 其中我必须枚举每个哈密顿路径 进行一些分析并返回结果 为此 我需要能够枚举所有可能的哈密尔顿路径
  • Bootstrap 4 - 如何在移动设备上更改顺序?

    我正在使用 Bootstrap 4 制作一个由两列组成的响应式布局 两列总共有 9 个 div 第一列有 4 个 第二列有 5 个 如果断点低于 LG 我想更改列内 div 的顺序 这是我想要实现的解释和正确的顺序 我目前拥有的 div c
  • 如何在弹性搜索聚合中使用分页(大小和来源)?

    如何在elasticsearch聚合中使用分页 大小和来自 我在聚合中使用了大小和来自 它引发了exmaple异常 我想查询像 GET index nameorder search size 0 query filtered query b
  • 将数学字符串转换为 int

    有没有一种简单的方法可以获取 5 4 等字符串并返回 20 最简单的方法是使用Rhino JavaScript 引擎 http java sun com developer technicalArticles J2SE Desktop sc
  • Angular.js 中基于 OpenID 的身份验证(使用 Flask 后端)

    一 如何实现 Angular js 中基于 OpenID 的身份验证 使用 Flask 后端 Web 应用程序 看起来 Angular js 代码需要合并逻辑 就像这个例子在这里找到的 http espeo pl authenticatio
  • 类型错误:mel() 接受 0 个位置参数,但给出了 5 个

    当我使用 Tacotron 培训笔记本时 我收到一条错误消息 说明了这一点 Traceback most recent call last
  • 您可以在枚举类中使用按位运算符而不进行强制转换吗?

    我喜欢使用枚举类 但有时我将它们用作标志 并且我必须不断地转换为int如果我想使用按位运算符 有没有办法在不铸造的情况下做到这一点 我认为您无法为它们定义运算符 如果我有采用枚举类的函数 我必须这样做吗 enum class Flags F
  • mysql(i)_real_escape_string,安全可靠吗?

    function Query args func get args if sizeof args gt 0 query args 0 for i 1 i lt sizeof args i query preg replace mysql r
  • 如何制作一个使用全局类型但不使用它来扩展项目的 NPM 包?

    问题 任何在许多不同文件中重用大量类型的项目都可以使用在脚本文件 这些类型在整个项目中全局可见 不需要导入 请参阅官方手册 https www typescriptlang org docs handbook modules html 在
  • 编辑 UI 的 task.Wait() 上出现死锁

    我试图在这里找到一些解决我的问题的方法 但没有结果 或者我只是没有得到正确的结果 所以如果有人可以帮助 解释我将非常感激 我正在使用 Win Form 为系统管理员开发一个工具 现在我需要在选定的后台运行的计算机上创建连续的 ping UI
  • 有没有办法改变散点图上的原点轴(零线)?

    有没有办法改变散点图上的轴 假设将轴从 0 0 即 零线 移动到 3 3 之类的位置并制作象限图 我尝试将 xaxis 和 yaxis 上的 zeroline 值设置为False 然后从 shapes 的两个轴上绘制两条常量线 但我想知道是
  • NodeJS MySQL 转储

    我尝试编写一个基本的 cron 脚本来运行和 转储 mysql 数据库 由于某种原因 当它 成功保存文件 时 它确实创建了该文件 但它是空的 如果我不保存文件 而是执行 console log 它会打印一个空字符串 对我可能做错了什么有什么
  • NSView 初始化:-init: 与 -awakeFromNib:

    我有一个简单的课程MyView继承自NSView和实例变量NSImage image 在里面 类的功能是在视图上绘制图像 然而 在 drawRect 图像实例始终相等nil 如果它是在 init 功能而不是nil如果它是在 awakeFro
  • 通过 TCP 传输程序集

    我目前正在尝试通过 TCP 连接发送序列化对象 如下所示 BinaryFormatter formatter new BinaryFormatter formatter Serialize clientStream Object Assem
  • 如何反汇编正在运行的linux内核?

    寻找一种反汇编正在运行的内核的方法 我可以通过 dev kmem 来实现吗 我运行的是linux 2 6 32 或者我可以使用内核模块来运行内核吗 我是初学者 请帮忙 我想做的就是通过查看是否出现某些特定指令来检查内核映像中是否存在某些恶意
  • MediaStyle 通知:播放/暂停按钮不响应单击

    在我的应用程序中 当用户选择要播放的音频文件时 当文件准备好并且播放开始时 会成功显示 MediaStyle 通知 元数据信息已更新 标题 图标等 但是 1 Play Pause button does not respond to cli
  • 在 PyCharm 中调试 asyncio 代码会导致绝对疯狂的不可重复错误

    在我的基于使用 PyCharm 调试器进行调试的 asyncio 和 asyncio tcp 连接的项目中 我遇到了非常非常荒谬的错误 如果我在运行后在代码上放置断点 则断点永远不会触发 但是如果在启动程序之前设置了断点 则会触发断点 但在
  • Select2 下拉更改事件不起作用

    我在用Select2下拉菜单 我需要根据下拉菜单选择执行一些功能 我尝试过以下代码 但它对我不起作用 eventSelect on select2 select function e log select2 select e eventSe
  • 结构体中的指针和值有什么区别?

    给定以下结构 type Exp struct foo int bar int 在结构中使用指针或值时 性能有何区别 是否有任何开销或者这只是 Go 编程的两个流派 我会使用指针来实现链式结构 但这是否是我们必须在结构中使用指针以获得性能的唯