问题标签 [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 投票
5 回答
4260 浏览

c++ - 在 C++ 中前向声明指向结构的指针

我正在使用具有如下声明的 3rd 方库:

我想创建一个在构造函数中采用HandleType的类:

包括定义HandleType的标头。通常,我只是前向声明这种类型,但我无法弄清楚它的语法。我真的很想说:

但这在 GCC 中表示“* 之前的预期标识符”。我能看到的唯一解决方案是像这样编写我的类:

但这依赖于库的内部细节。也就是说,它使用名称__INTERNAL_DATA,这是一个实现细节。

似乎应该可以在不使用 __INTERNAL_DATA (库实现的一部分)的情况下前向声明 HandleType (公共 API 的一部分)。有人知道怎么做吗?

编辑:添加了有关我正在寻找的内容的更多详细信息。

0 投票
5 回答
8528 浏览

c# - 为什么公共领域比属性快?

我在 XNA 中四处寻找,发现其中的Vector3类使用公共字段而不是属性。我尝试了一个快速基准测试,发现struct差异非常显着(将两个向量加在一起 ​​1 亿次需要 2.0 秒的属性和 1.4 秒的字段)。对于引用类型,差异似乎并没有那么大,但确实存在。

那为什么呢?我知道一个属性被编译成get_Xset_X方法,这会产生方法调用开销。但是,这些简单的 getter/setter 不总是被 JIT 内联吗?我知道你不能保证 JIT 决定做什么,但肯定这在概率列表中相当高吗?还有什么可以将公共字段与机器级别的属性分开?

我一直想知道的一件事是:自动实现的属性 ( public int Foo { get; set; }) 如何比公共字段“更好”的 OO 设计?或者更好地说:这两者有什么不同?我知道通过反射使它成为一个属性更容易,但还有什么?我敢打赌,这两个问题的答案是一样的。

顺便说一句:我正在使用 .NET 3.5 SP1,我认为它解决了带有结构的方法(或结构的方法我不确定)没有内联的问题,所以不是这样。我想我至少在使用它,它肯定已经安装了,但话又说回来,我使用的是带有 SP1 的 Vista 64 位,它应该有 DX10.1,但我没有 DX10.1 ..

另外:是的,我一直在运行发布版本:)

编辑:我很欣赏快速回答的家伙,但我表示我确实知道属性访问是一个方法调用,但我不知道为什么可能是内联方法比直接字段访问慢。

编辑 2:所以我创建了另一个struct使用显式 GetX() 方法的方法(我怎么不会错过我的 Java 日子),并且无论我是否禁用内联(通过),它[MethodImplAttribute(MethodImplOptions.NoInlining)]执行相同的操作,所以结论:非静态方法显然从不内联,即使在结构上也是如此。

我认为有例外,JIT 可以优化虚拟方法调用。为什么这种情况不会发生在不知道继承的结构上,因此方法调用只能指向一个可能的方法,对吧?还是因为您可以在其上实现接口?

这有点可惜,因为它真的会让我考虑在性能关键的东西上使用属性,但是使用字段让我觉得很脏,我还不如用 C 写我正在做的事情。

编辑 3:我发现这篇帖子是关于完全相同的主题的。他的最终结论是属性调用确实得到了优化。我也可以发誓我已经读过很多次简单的 getter/setter 属性会被内联,尽管callvirt在 IL 中。那我是不是要疯了?

编辑 4:Reed Copsey 在下面的评论中发布了答案:

回复:Edit3 - 查看我更新的评论:我相信这是 x86 JIT 与 x64 JIT 问题。x64 中的 JIT 并不成熟。随着越来越多的 64 位系统每天上线,我希望 MS 能够迅速改进这一点。——里德·科普西

我对他的回答的回应:

谢谢,这就是答案!我尝试强制 x86 构建,所有方法都同样快,而且比 x64 快得多。实际上,这对我来说非常令人震惊,我不知道我在 64 位操作系统上生活在石器时代。我会在我的回答中包含您的评论,这样它会更好。– 朱利安

谢谢大家!

0 投票
6 回答
5390 浏览

.net - 结构到字节数组以通过套接字发送

从结构中获取字节数组以通过 TCP 套接字发送的最佳方法是什么?我正在使用 .Net(VB 或 C#)。

0 投票
19 回答
1390 浏览

c++ - C++ 结构“可接受”多少功能?

我的第一篇文章,所以请放轻松!

我知道 C++ 中的结构和类之间没有真正的区别,但是包括我在内的很多人都使用结构或类来显示意图 - 用于对“普通旧数据”进行分组的结构和用于封装数据的类具有有意义的操作。

现在,这很好,但是你什么时候开始认为某些东西不再只是一个结构,而应该成为一个类?

我认为结构具有合理性的事情:

  1. 仅具有简单初始化代码的构造函数。
  2. 序列化代码,例如流插入/提取运算符。

我不太确定但可能会做的事情:

  1. 比较运算符
  2. 简单的转换功能 - 例如在从外部源接收数据后对所有成员进行字节交换。

我不认为结构应该有:

  1. 动态内存分配。
  2. 析构函数。
  3. 复杂的成员函数。

界限在哪里???

另外,将类实例作为结构的成员是否合理?例如

请记住,我不是在谈论你可以用 C++ 做什么,我感兴趣的是你在设计好的软件时应该做什么。

想法?

0 投票
4 回答
6603 浏览

c# - C# P/Invoke 结构问题

我正在尝试为 C API(本机 Win dll)编写 C# P/Invoke 包装器,通常这工作正常。唯一的例外是在 C 代码中将结构作为参数的特定方法。该函数在没有任何异常的情况下被调用,但它返回 false 表示执行失败。

在 API 头文件中,涉及的方法和结构定义如下:

我尝试使用以下代码创建 C# P/Invoke 包装器:

然后我尝试使用以下 C# 代码调用 EncodeMagstripe 方法:

这会导致抛出 ApplicationException,错误代码为 801,根据文档,这意味着“数据包含太多字符,无法用于所选的 Track 2 格式。”。但是,所选曲目格式最多应允许 39 个字符(我也尝试过较短的字符串)。

我怀疑问题的发生是由于我在 MSTrackData 定义中做错了什么,但我看不出这可能是什么。有没有人有什么建议?

0 投票
11 回答
3258 浏览

c - 将数组及其长度变量包装在 C 中的结构中是最佳实践吗?

我将很快开始在操作系统课程中使用 C,并且我正在阅读有关使用 C 的最佳实践,以便以后减少头痛。

这一直是我关于阵列的第一个问题,因为它们很容易搞砸。

将数组及其关联变量包含在结构中的长度捆绑在一起是一种常见的做法吗?

我从未在书中见过它,通常他们总是将两者分开或使用类似 sizeof(array[]/array[1]) 之类的交易。

但是通过将两者包装到一个结构中,您可以通过值和引用传递结构,除非使用指针,否则您无法真正使用数组,在这种情况下,您必须再次跟踪数组长度.

我开始使用 C,所以上面的内容可能是非常错误的,我还是个学生。

干杯,凯。

0 投票
7 回答
525 浏览

c# - Questions about Structs

MSDN says that a class that would be 16 bytes or less would be better handled as a struct [citation].
Why is that?
Does that mean that if a struct is over 16 bytes it's less efficient than a class or is it the same?
How do you determine if your class is under 16 bytes?
What restricts a struct from acting like a class? (besides disallowing parameterless constructors)

0 投票
4 回答
7920 浏览

c# - 使用反射设置结构中字段的值,该字段是结构数组的一部分

目前,我的代码使用反射成功地设置了对象的字段/属性/数组的值,给定了从根对象到字段/属性的路径。

例如

上面的示例将“MyObject”对象的“MyProperty”属性设置为“新值”

我无法使用反射在结构中设置字段的值,该结构是结构数组的一部分,因为该结构是值类型(在数组内)。

这是一些测试类/结构......

下面是我如何成功设置列表中普通属性/字段和道具/字段的值...

之后我想要 myObject.myStructArray[0].myField = ''my new value" 和 myObject.myOtherStructArray[1].myOtherField = ''my new value"

我所需要的只是替换“FieldInf.SetValue(foundObject, newValue);” 线

提前致谢

0 投票
2 回答
12710 浏览

c# - 从 C# 调用 C++ dll 函数:结构、字符串和 wchar_t 数组

这是我需要解决的一个简单问题,但它让我觉得我的头发变白了,因为我所有的尝试都返回了同样的错误:

“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

我有一个用 C++ 编写的示例应用程序,它调用 dll。以下是相关代码:

现在,当我调试 C++ 代码时,它会做正确的事情——将一些 Unicode 数据写入数据结构。

这是我尝试在 C# 中做同样的事情

我的猜测是我没有正确编组 RECO_DATA 结构,因为 convertHKID_Name 函数写入的正是这个结构。但是我应该如何解决它?

0 投票
2 回答
4473 浏览

.net - Expression 是一个值,因此不能作为赋值的目标

今天我在使用结构时遇到了一个让我措手不及的问题,我希望有人可以为我解释一下。

我有一个这样定义的结构:

我有一个包含此信息的课程

我有一个演示模型,我想在其中设置这样的基础属性

奇怪的是,如果我将 Payment 属性更改为这样的公共字段,我可以完成这项工作:

显然有一些我不了解导致这种情况的结构。这是一个坏主意吗?有没有更好的办法?我究竟做错了什么?