在游戏中获得C ++工作经验的最佳方法(来自C#)[关闭]


19

我是一名软件开发人员,具有C#(五年经验)以及其他几种语言的经验。

我的“梦想工作”是作为开发人员从事视频游戏。

大多数工作都需要C ++的知识,而我目前还不了解(一些基本知识除外)。

我环顾四周,大多数大型游戏公司都需要3-5年的C ++经验。

我的问题是-通过C#,什么是让自己达到所需的经验水平的好方法?

我想到了一些可行的方法:

从书籍中获得有关C ++的更多知识。参加以C ++编写的开源项目。学习C ++并拥有C级工作经验的最佳方法是什么,特别是对于游戏行业而言?


1
谢谢,我会检查出来的。虽然我不确定这是与我不是编程初学者完全相同的问题。
spaceOwl

3
没有人会在乎您从何处获得经验,或是否为此付出了报酬。如果您需要C ++的经验,请开始对C ++进行编程。
Maik Semder

@liortal Repost:另请参阅对于初学者有哪些重要提示?(有些怪人删除了我对此线程的所有评论)。
bobobobo

Answers:


29

作为游戏开发人员,我主要要雇用C#的人是缺乏底层知识。

因此,请考虑一个项目,其中您的工作需要进行低级优化,例如重新安排类的数据布局或重写代码以利用SIMD指令。制作一个C ++开源游戏,对其进行优化,然后将增加的帧速率发布到简历中。

如果我正在面试您,我会不太在意简历中的C ++,而会更多地关注您是否可以回答我的C / C ++ /低级面试问题。我会对您可能遇到的一些标准面试问题保持警惕(警告:我不是C#专家):

  • C ++类如何在内存中布置?画一个字节图。包括vtable指针和成员变量的填充/对齐。那派生类呢?那么乘以类呢?
  • 虚拟函数调用在低层如何发生?讨论汇编操作,例如读取内存中的值并跳转到地址。
  • 了解具有各种继承关系的类型的指针之间的C样式转换,static_cast和dynamic_cast。例如,类B和C都从类A派生。当您尝试使用这些各种类型转换从A *转换为B *(或从B *转换为C *)时,会发生什么情况?(我提到这是因为我认为C#甚至不允许这些特定的强制类型转换。)
  • 为什么通过值而不是通过引用传递stl向量很糟糕?(我提到,因为C#中的大多数类型都是引用类型,因此在C#中基本上不可能犯这种错误。)
  • 结构或功能对缓存友好意味着什么?为什么数组结构的性能要比结构数组好?
  • 了解堆,堆栈和静态内存。如果为对象分配了新对象,则该对象在进程的内存中位于何处?局部变量呢?全局变量?
  • 什么是内存泄漏?有什么最佳实践可以避免这些情况?(我提到是因为C#中没有删除!)
  • 您将如何调试内存访问冲突崩溃?如果崩溃发生在您没有源代码的某个中间件库中,该怎么办?

1
重新发布:我已经知道了解vtable指针在内存中的位置的有用性,因为我之前遇到了一个涉及该问题错误。但是,第二个问题到底有什么用呢?知道“将值读入内存的汇编级操作”如何使一名合格的C ++程序员?
bobobobo

我对暴雪UI实习生的暴雪面试涉及点1、2、3(在较小程度上),5和7。他还询问了有关调试/测试的问题(类似于点8),我认为这个答案正好在即使是一般的高级游戏开发公司。
迪恩·奈特

2
@DeanKnight我毫不怀疑。但是我仍然想知道OP如何认为这种问题使某人成为一名优秀的C ++程序员(最初的问题是关于如何成为一名更好的C ++程序员),而不是仅仅帮助某人获得面试机会。
bobobobo

2
您可能会怀疑,bobobobo,但是有关vtable指针错误的链接是一个很好的例子,它说明了了解虚函数调用的内部原理是多么有用。考虑一个类似的错误,它不是vtable指针为null而是垃圾意识到它是垃圾的一种方法是,逐步完成对虚拟函数调用的反汇编,而不是使用有效的vtable或有效的方法,使程序无处不在。
Eric Undersander

1

埃里克怎么说。我还要补充一点,以避免不必要的“新”情况。它在C#中很常见,但在C ++ 11中被认为是不好的做法,它比堆栈分配要慢,并且更危险,因为您必须手动对其进行分配。

对于旧书,我也会小心,因为它们会教旧法。我个人更喜欢可靠的论坛/网站,stackoverflow / isocpp。


谢谢。我一直在寻找关于做什么的更广泛,更一般的建议/建议,而不是要学习的语言细节。
spaceOwl

“避免new”确实不是一个明智的建议。new有指针时使用。如果class Derived : Base,则a Base var = Derived();非法,但Base *var = new Derived();合法。因此,您需要使用指针来使多态性正常工作。
bobobobo

是的,但是您可以使用std :: unique_ptr完成多态并避免使用裸露的指针(尽管您仍然在unique_ptr构造函数中使用new关键字)
Eric B

抱歉,我在上述评论中弄错了。 Base var = Derived() 可以,但是会切成薄片,并且您不知道该信息会丢失var。要解决切片问题,可以使用指针。
bobobobo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.