我有一个试用期面试。我不确定这个词是否恰当)面试官让我告诉他结构和阶级有什么不同。
所以我告诉了他我知道的一切,以及我在msdn上看到的一切。
那个人说"不够",我不知道。所以他说:
结构体被优化了,所以如果有整数和浮点数,它们有一些相同的部分,那么它会节省这个空间,所以struct withint=0
和float=0
的大小是int=int.MAX
、float=float.MIN
的一半。
好吧。所以我说——没听说过。
但是,面试结束后,我想了想,这对我来说真的没有意义。这意味着,当我们改变结构体中某个变量的值时,结构体的大小会发生变化。它不可能在内存的同一位置,如果膨胀时发生碰撞怎么办。我们必须在某处写下我们要跳过的位,不确定它是否会给出任何优化。
他还问我Java中的struct和class有什么不同。我回答说,Java中没有结构体,他说:"不适合程序员,但数字类型是结构体。"我有点像WTF。
基本上问题是:
这家伙知道什么,这是很难知道的(我的意思是,我在网上找它,找不到一个东西)
或者他对自己的工作一无所知,只是想在面试时表现得很酷。
这家伙似乎对可以应用于c#结构体的StructLayoutAttribute
感到困惑。它允许您指定如何布局结构体的内存,实际上,您可以创建具有不同类型字段的结构体,这些字段都从相同的内存地址开始。他似乎没有注意到的一点是,您每次只使用其中一个字段。MSDN在这里有更多信息。查看页面底部的示例结构体TestUnion
。它包含四个字段,都带有FieldOffset(0)
。如果您运行它,您可以为i
字段设置一个整数值,然后检查d
字段并查看它是否已更改。
对我来说,看起来(你们中的一个)不是在谈论c#结构/类,而是更低级或更通用的structs
。
有一种特殊的内存优化,例如在
中 1。 C (unions
)
和
2。 Pascal (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/)。我会投票给对面试工作非常了解的面试官