根据这篇关于 Java Enum 的文章,运行时安全可以通过使用==
运算符来比较状态和阻止来实现NullPointerException
。
if(testPz.getStatus() == Pizza.PizzaStatus.DELIVERED);
Run Code Online (Sandbox Code Playgroud)
此外,compile-time-safety
虽然从逻辑上证明比较是错误的,但通过使用运算符可以避免此问题==
。
if(testPz.getStatus() == TestColor.GREEN);
Run Code Online (Sandbox Code Playgroud)
你能告诉我什么是 Java 中的
compile-time-safety
和吗?runtime-safety
如果可以的话请给我一个小例子。
我读过很多关于外部变量的内容,但似乎没有人适当地解决它。如果我在 C 中声明并定义一个变量,它会在文件的该范围内分配内存。但在多文件模块化项目的后期阶段,该变量被声明为 extern,该变量应将其存储在数据段中,以展示 extern 功能的全局行为。
所以我试图弄清楚如何以及何时分配内存,即 extern 变量的编译时和运行时行为。
我想要一个大容器(特别是 a std::array
),其大小我在编译时知道,但我可以从构造函数中指定。
我已经能够完成第一部分:即 std::array ,其大小在编译时指定。示意图:
// hpp
constexpr int my_size = 100;
class C
{
std::array<int, my_size> data;
}
// main
c = C()
Run Code Online (Sandbox Code Playgroud)
现在我想做同样的事情,但是传递std::array
到类构造函数中,可能作为constexpr
:
// hpp
class C
{
std::array<int, mysize> data;
C(constexpr int mysize);
}
// cpp
C::C(constexpr int mysize)
{
data = std::array<int, mysize>
}
// main
constexpr int mysize = 100;
c = C(mysize);
Run Code Online (Sandbox Code Playgroud)
显然这是错误的,因为mysize
它是在构造函数中传递的,但mysize
也是在声明时必须知道的类型的一部分。
那么我该怎么做呢?
几乎每个 OOP 程序员都接触过控制反转的概念。在 C++ 中,我们可以通过动态回调(即 lambda 和函数指针等函子)来实现该原理。但是,如果我们在编译时知道要向驱动程序注入什么过程,理论上我相信有一种方法可以通过组合回调和驱动程序/信号/诸如此类的函数来消除函数传递和调用的开销进入“展开的程序”。这是一个例子。
对于 GUI 程序,我们有关于窗口 1) 设置、2) 循环和 3) 终止的逻辑。我们可以在 1) 窗口设置之后、2) 在每个渲染循环中、3) 和终止之前注入代码。程序方法是这样写:
// Snippet 1:
init_window();
init_input_handler();
init_canvas();
init_socket();
while (!window_should_close()) {
update_window();
handle_input();
draw_on_canvas();
send_through_socket();
}
drop_input_handler();
drop_canvas();
drop_socket();
terminate_window();
Run Code Online (Sandbox Code Playgroud)
OOP 程序员以解耦和适当的抽象为荣。相反,我们这样写:
// Snippet 2:
init_window();
on_window_init_signal.send();
while (!window_should_close()) {
update_window();
on_render_signal.send();
}
on_exit_signal.send();
terminate_window();
Run Code Online (Sandbox Code Playgroud)
但这会带来如上所述的不必要的开销。我的问题是:我们如何利用C++元编程机制来实现零开销控制反转,以便与代码片段2类似形式的代码可以静态地(即在编译时)转换为代码片段1 ?
编辑:我可以想到优化器中广泛存在的循环优化。也许这是该问题的通用版本。
在Compiletime或Runtime中使用if (isChecked)
vs. 有任何性能问题吗?if (isChecked == true)
请考虑以下代码:
void f(auto& i, auto& j)
{
static_assert(/* SOMETHING */, "");
// function body here...
}
Run Code Online (Sandbox Code Playgroud)
我希望该/* SOMETHING */
部件检查以下代码是否编译(考虑所有标准规则,如隐式转换规则):
i += j;
Run Code Online (Sandbox Code Playgroud)
我试过了:
sizeof(std::declval<decltype(i)>() += std::declval<decltype(j)>());
Run Code Online (Sandbox Code Playgroud)
但它失败了.
这样做的正确方法是什么?
编辑:我了解SFINAE和约束模板参数.这不是问题的主题.主题是static_assert
在测试表达式的正确性时如何使失败.
有这个代码:
// Called when x is "a"
#define do(x) doA()
// Called when x is "b"
#define do(x) doB()
Run Code Online (Sandbox Code Playgroud)
是否可以使预处理器解释do("a")
为doA()
和do("b")
asdoB()
以及其他doUndefined()
(如果提供未知)x
?澄清一下:我想将x
参数映射到任意代码或函数调用,而不仅仅是 call do{uppercase_x}()
。它必须在编译时完成。并且x
参数必须是字符串。
谢谢!
我经常看到程序员,尤其是在 StackOverflow 上,他们指出各自程序的编译时间,有时打算减少这些相应的时间,即使结果只是微妙的。
当然,我可以理解,当程序员处于任何程序的开发过程中时,创建、测试和编辑源代码的来回节奏以及保持这些过程之间的时间间隔较短很重要,但我只是不明白,如果编译时间只有几毫秒,为什么这是一个大问题?
即使只有几秒钟,为什么呢?在那段时间里,我们可以从编码或其他任何事情中稍微放松一下。
是我们太不耐烦了吗?
或者我还遗漏了一些关于编译时的伪装指示的内容吗?
为什么编译时的持续时间很重要?是不是有点暗示了?
compile-time ×8
c++ ×4
c ×3
runtime ×3
compilation ×2
performance ×2
c# ×1
c++11 ×1
extern ×1
if-statement ×1
java ×1
optimization ×1
preprocessor ×1