小编Ant*_*rez的帖子

在C++中是否将额外字节初始化为0?

假设我有一个包含int和char的结构:

struct thing_t {
    int value = 0;
    char other_value = 0;
};
Run Code Online (Sandbox Code Playgroud)

由于事物在内存中对齐的方式,sizeof(thing_t)应该是8,因为最大成员的大小是4个字节.如果我创建一个默认初始化的实例thing_t,那么额外的3个字节是否会被初始化为0?

我认识到这通常不会出现,但我正在编写一个哈希函数,哈希函数的默认行为是散列泛型类型,就像它是一个字节数组一样.如果额外的字节偶尔没有初始化为0,我意识到我的方法可能会导致问题.

c++ memory initialization

7
推荐指数
1
解决办法
165
查看次数

最小的可执行程序 (x86-64)

我最近看到这篇文章描述了最小的 ELF 可执行文件,但是这篇文章是为 32 位编写的,我无法在我的机器上编译最终版本。这让我想到了一个问题:可以编写的最小的 x86-64 ELF 可执行文件是什么?

assembly x86-64 elf

4
推荐指数
1
解决办法
2452
查看次数

兼具聚合初始化和模板推导

背景:

\n

C++17 有两大特性:聚合初始化模板类型推导(对于类)。聚合初始化允许您实例化字段而无需复制或移动它们,并且模板类型推导使您不必指定参数的类型。

\n

下面代码中的类Wrapper就是一个例子。只要HAVE_MOVE_AND_COPY未定义,它就具有聚合初始化,但模板类型推导不起作用。

\n

另一方面,如果定义HAVE_MOVE_AND_COPY ,则模板类型推导有效,但聚合初始化会中断。我怎样才能两者兼得?

\n
#include <cstdio>\n#include <utility>\n\ntemplate<class T> \nstruct Wrapper {\n    T value;\n   #ifdef HAVE_MOVE_AND_COPY\n    Wrapper(T const & val) : value{val} {}\n    Wrapper(T && val) : value{std::move(val)} {}\n   #endif\n    Wrapper(Wrapper const &) = default;\n    Wrapper(Wrapper &&) = default;\n    \n\n};\n\nstruct VocalClass {\n    VocalClass() { puts("VocalClass()"); }\n    VocalClass(VocalClass const&) { puts("VocalClass(VocalClass const &)"); }\n    VocalClass(VocalClass &&) { puts("VocalClass(VocalClass &&)"); }\n};\n\nint main() {\n    Wrapper<VocalClass> w { VocalClass() …
Run Code Online (Sandbox Code Playgroud)

c++ templates aggregate-initialization type-deduction c++17

1
推荐指数
1
解决办法
1198
查看次数