您怎么知道在编译时某些东西是否是常量?
有一般规则吗?
例如虚拟调用,它们在编译时是否已知?
可以正确地说,任何需要堆内存分配的内容在编译时都不知道,因为内存仅在运行时分配。只有访问该内存及其值,才能知道其引用的对象
答案 0 :(得分:5)
有很多方法,没有通用规则,除非编译器将它们“虚拟化”,否则虚拟调用通常不会。
根据“好像”规则,编译器可以在编译时解决的任何事情都可以在编译时完成。
此外,某些操作很难在编译时执行,例如评估非类型模板参数。 C ++标准具有constexpr
规则,这些规则指示编译器在初始化非类型模板参数时必须允许哪种操作。这些constexpr
规则很复杂,要提出SO答案要花很长时间。找到一本不错的C ++书。
但是重要的是要知道两种情况都是一样的。编译器可以在运行时自由执行任何操作; C ++解释器可以是合格的C ++编译器。
C ++指定在抽象计算机上运行的程序的行为,而不是硬件上实际发生的事情。