6

我有一个试用期的工作面试(?我不确定这是不是这个词),面试官让我告诉他结构和班级之间有什么区别。

所以我告诉他我知道的一切以及我在 msdn 上读到的一切。

那家伙说“不够”,我没有头绪。于是他说:

结构体已经过优化,所以如果存在整数和浮点数,它们有一些相同的部分,那么它将节省这个空间,所以结构体 int=0float=0大小是int=int.MAX,的一半float=float.MIN

好的。所以我就像 - 没听说过。

但是,在面试之后,我正在考虑它,这对我来说真的没有意义。这意味着,当我们更改其中某个变量的值时,结构大小会有所不同。而且在内存中不可能真的在同一个地方,万一扩展的时候发生碰撞怎么办。而且我们必须在某处写我们要跳过的位,不确定它是否会提供任何优化。

另外,他在乞讨时问我Java中的struct和class有什么区别。我已经回答过,Java 中没有结构,他说“不适合程序员,但数字类型是结构”我有点像 WTF。

基本上问题是:

这家伙是否知道一些很难知道的事情(我的意思是,我在网上寻找它,找不到东西)

或者也许他对自己的工作一无所知,并试图在工作面试中看起来很酷。

4

2 回答 2

4

这家伙似乎对StructLayoutAttribute可以应用于 C# 结构的内容感到困惑。它允许您指定结构的内存是如何布局的,实际上,您可以创建一个结构,该结构具有不同类型的字段,这些字段都从相同的内存地址开始。他似乎错过的部分是您一次只能使用其中一个字段。MSDN在这里有更多信息。查看TestUnion页面底部的示例结构。它包含四个字段,全部带有FieldOffset(0). 如果您运行它,您可以为该字段设置一个整数值i,然后检查该d字段并查看它是否已更改。

于 2014-06-03T10:22:52.983 回答
1

对我来说,看起来(你们中的一个)不是在谈论 C# 结构/类,而是在谈论更底层或更一般的structs.

有这种特殊的内存优化使用,例如

1. C ( unions)

并且在

2.帕斯卡 ( variant records)

参见例如文章如何将 C 联合转换为 Delphi?例如。

这种具有动态多态内存分配的“结构”的特殊形式被称为

3. http://en.wikipedia.org/wiki/Variant_type

在 C# 之前的时代(数十年来,在多种语言中),它被大量用于 OLE 自动化 API 中的进程间数据交换。

4. (s)他可能也在谈论结构序列化格式与类内存格式(参见例如https://developers.google.com/protocol-buffers/docs/encoding的 C# 结构序列化示例)

5.您可能还在谈论内部 JVM 内存分配的差异(参见例如http://blog.jamesdbloom.com/JVMInternals.html),这提醒我您可能在谈论类文件格式和结构和特殊编码数字文字与类编码(http://blog.jamesdbloom.com/JVMInternals.html#constant_pool

因此,经过 5 次猜测后,我相信您在翻译与面试官的谈话时遗漏了一些东西,并且(s)他可能浏览了您声称知道的区域,结果您不知道。也可能是他开始胡说八道并检查你的反应。任何工作都不建议在简历上谎报你的技能(例如http://www.softwaretestinghelp.com/5-common-interview-mistakes/)。我会投票给面试官足够了解面试工作

于 2014-06-04T12:36:34.987 回答