问题标签 [struct]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
12 回答
247149 浏览

c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

为什么sizeof运算符返回的结构大小大于结构成员的总大小?

0 投票
7 回答
3735 浏览

c# - 如何在不可变的泛型 Pair 结构上实现 IEqualityComparer?

目前我有这个(阅读建议后编辑):

问题是 First 和 Second 可能不是引用类型(VS 实际上警告我这一点),但代码仍然可以编译。我应该在比较它们之前将它们(第一和第二)转换为对象,还是有更好的方法来做到这一点?

编辑:请注意,我希望这个结构支持值和引用类型(换句话说,按类约束不是有效的解决方案)

编辑2:至于我想要实现的目标,我希望它可以在字典中工作。其次,SRP 现在对我来说并不重要,因为这并不是这个问题的真正本质——它总是可以在以后重构。第三,与 default(T) 比较不能代替与 null 比较 - 试试看。

0 投票
9 回答
1858 浏览

c++ - 让 C 回调调用 C++ 成员函数的最佳方法?

给定一个典型的类:

让基于 C void* 的回调(例如 pthread_create() 或信号处理程序)调用成员函数的最佳方法是什么?

0 投票
11 回答
219836 浏览

c - 您如何比较 C 中的结构是否相等?

您如何比较标准 C 中结构的两个实例是否相等?

0 投票
8 回答
115133 浏览

c - 如何找到结构的大小?

什么是 sizeof(a)?

0 投票
10 回答
13937 浏览

c - ANSI C 是否支持有符号/无符号位域?

将位字段限定为有符号/无符号是否有意义?

0 投票
9 回答
2882 浏览

c++ - 通过更改窗口大小获得不同的标题大小

我有一个将 TCP 标头表示为结构的 C++ 程序:

如果我运行这个程序,我会得到这个标头的大小为 24 字节,这不是我期望的大小。如果我将字段“wWindow”的类型更改为“unsigned int wWindow:16”,它的位数与 unsigned short 相同,程序会告诉我结构的大小现在是 20 字节,这是正确的大小。为什么是这样?

我在 32 位 x86 机器上使用带有 SP1 的 Microsoft Visual Studio 2005。

0 投票
10 回答
91230 浏览

c - 在 C 中按值传递结构而不是传递指针有什么缺点吗?

在 C 中按值传递结构而不是传递指针有什么缺点吗?

如果结构很大,显然存在复制大量数据的性能方面,但对于较小的结构,它应该基本上与向函数传递多个值相同。

当用作返回值时,它可能会更有趣。C 只有函数的单个返回值,但您通常需要多个。所以一个简单的解决方案是将它们放在一个结构中并返回它。

是否有任何理由支持或反对这一点?

由于我在这里谈论的内容对每个人来说可能并不明显,所以我将举一个简单的例子。

如果您使用 C 进行编程,您迟早会开始编写如下所示的函数:

这不是问题。唯一的问题是您必须与您的同事商定参数的顺序,以便您在所有函数中使用相同的约定。

但是当你想返回相同类型的信息时会发生什么?你通常会得到这样的东西:

这工作正常,但问题更多。返回值是返回值,但在此实现中不是。从上面无法看出函数 get_data 不允许查看 len 指向的内容。并且没有什么可以让编译器检查一个值是否实际上是通过该指针返回的。所以下个月,当其他人在没有正确理解的情况下修改代码(因为他没有阅读文档?)它会在没有人注意到的情况下被破坏,或者它开始随机崩溃。

所以,我提出的解决方案是简单的结构

示例可以这样重写:

出于某种原因,我认为大多数人会本能地让 Exam_data 获取指向结构 blob 的指针,但我不明白为什么。它仍然得到一个指针和一个整数,它们在一起更清楚了。而在 get_data 的情况下,不可能像我之前描述的那样搞砸,因为长度没有输入值,并且必须有一个返回的长度。

0 投票
7 回答
8685 浏览

.net - 为什么 .NET 中没有 RAII?

作为一名 C++ 开发人员,Java 和 .NET 中缺少RAII(资源获取即初始化)一直困扰着我。清理的责任从类编写者转移到其消费者(通过try finally.NET 的using构造)这一事实似乎明显逊色。

我明白为什么在 Java 中不支持 RAII,因为所有对象都位于堆上,而垃圾收集器本身不支持确定性销毁,但在 .NET 中引入了值类型(struct)我们有(似乎) RAII 的完美候选人。在堆栈上创建的值类型具有明确定义的范围,并且可以使用 C++ 析构函数语义。但是,CLR 不允许值类型具有析构函数。

我的随机搜索发现了一个论点,即如果一个值类型被装箱,它就属于垃圾收集器的管辖范围,因此它的销毁变得不确定。我觉得这个论点不够有力,RAII 的好处大到足以说明带有析构函数的值类型不能被装箱(或用作类成员)。

长话短说,我的问题是:是否有任何其他原因不能使用值类型来将 RAII 引入 .NET?(或者你认为我关于 RAII 明显优势的论点有缺陷吗?)

编辑:我一定没有清楚地表达这个问题,因为前四个答案没有抓住重点。我知道它的非确定性Finalize特征,我知道using构造,我觉得这两个选项不如 RAII。using类的消费者还必须记住一件事(有多少人忘记将 aStreamReader放在一个using块中?)。我的问题是关于语言设计的哲学问题,为什么它是这样的,可以改进吗?

例如,使用通用的确定性可破坏值类型,我可以使usingandlock关键字变得多余(可通过库类实现):


我不禁以我曾经看过但目前无法找到其来源的恰当报价作为结尾。

当我冰冷的死手超出范围时,您可以承担我的确定性破坏。——匿名

0 投票
6 回答
19762 浏览

c - 初始化一个非常大的结构的正确方法是什么?

在我们的代码中,我们曾经有这样的东西:

这曾经很好用,然后我们升级了 GCC 版本,突然开始看到堆栈溢出。查看程序集,旧的 GCC 代码(2.x)基本上是这样做的:

新的 GCC (3.4.x) 正在这样做

在查看了 C99 规范后,我明白了原因;C99 基本上要求堆栈上存在匿名结构。这是一个很好的概念,但这个结构有 4 MB 大,而且只打算存在于堆上!

我们已经使用了我们自己的“初始化”函数来显式设置成员,但这很丑陋并且令人头疼。我不认为 memset 是一个合适的解决方案,因为我不知道 0 的位值是该类型的适当零值(挑剔,我知道,但你在那里;我不介意编译器会这样做,因为它可以知道)

初始化这样的大型结构的“正确”或至少最好的方法是什么?

进一步澄清为什么我认为 memset 不是解决方案: 未显式初始化的成员的初始化规则与静态初始化相同,如下所示: - 如果它具有指针类型,则将其初始化为空指针;- 如果它具有算术类型,则将其初始化为(正或无符号)零;...

'memset' 会将内存设置为位模式零,这不一定是同一件事。想象一个不使用 IEEE 浮点数的系统。不寻常,但由 C 支持。 0.0 的表示不一定意味着“所有位为零”,它可以是处理器方便的任何东西。