aboutsummaryrefslogtreecommitdiffhomepage
path: root/print.html
diff options
context:
space:
mode:
authorjohannst <johannst@users.noreply.github.com>2023-05-29 20:34:16 +0000
committerjohannst <johannst@users.noreply.github.com>2023-05-29 20:34:16 +0000
commiteaad036407c9546be0de27f61745fef4b6856e56 (patch)
treec270e3fbc87f3b7c9fc25ac60f4f8f611962de5e /print.html
parent87c538b89ea68cf0c133a9243097ffac646e6739 (diff)
downloadnotes-eaad036407c9546be0de27f61745fef4b6856e56.tar.gz
notes-eaad036407c9546be0de27f61745fef4b6856e56.zip
deploy: d2013ee5952bbcf88906a832748783e372f3a939
Diffstat (limited to 'print.html')
-rw-r--r--print.html283
1 files changed, 277 insertions, 6 deletions
diff --git a/print.html b/print.html
index cd55f31..13a45f6 100644
--- a/print.html
+++ b/print.html
@@ -84,7 +84,7 @@
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
- <ol class="chapter"><li class="chapter-item expanded affix "><a href="intro.html">Introduction</a></li><li class="chapter-item expanded "><a href="tools/index.html"><strong aria-hidden="true">1.</strong> Tools</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="tools/zsh.html"><strong aria-hidden="true">1.1.</strong> zsh</a></li><li class="chapter-item expanded "><a href="tools/bash.html"><strong aria-hidden="true">1.2.</strong> bash</a></li><li class="chapter-item expanded "><a href="tools/fish.html"><strong aria-hidden="true">1.3.</strong> fish</a></li><li class="chapter-item expanded "><a href="tools/tmux.html"><strong aria-hidden="true">1.4.</strong> tmux</a></li><li class="chapter-item expanded "><a href="tools/git.html"><strong aria-hidden="true">1.5.</strong> git</a></li><li class="chapter-item expanded "><a href="tools/awk.html"><strong aria-hidden="true">1.6.</strong> awk</a></li><li class="chapter-item expanded "><a href="tools/emacs.html"><strong aria-hidden="true">1.7.</strong> emacs</a></li><li class="chapter-item expanded "><a href="tools/gpg.html"><strong aria-hidden="true">1.8.</strong> gpg</a></li><li class="chapter-item expanded "><a href="tools/gdb.html"><strong aria-hidden="true">1.9.</strong> gdb</a></li><li class="chapter-item expanded "><a href="tools/gdbserver.html"><strong aria-hidden="true">1.10.</strong> gdbserver</a></li><li class="chapter-item expanded "><a href="tools/radare2.html"><strong aria-hidden="true">1.11.</strong> radare2</a></li><li class="chapter-item expanded "><a href="tools/qemu.html"><strong aria-hidden="true">1.12.</strong> qemu</a></li><li class="chapter-item expanded "><a href="tools/pacman.html"><strong aria-hidden="true">1.13.</strong> pacman</a></li><li class="chapter-item expanded "><a href="tools/dot.html"><strong aria-hidden="true">1.14.</strong> dot</a></li></ol></li><li class="chapter-item expanded "><a href="monitor/index.html"><strong aria-hidden="true">2.</strong> Resource analysis & monitor</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="monitor/lsof.html"><strong aria-hidden="true">2.1.</strong> lsof</a></li><li class="chapter-item expanded "><a href="monitor/ss.html"><strong aria-hidden="true">2.2.</strong> ss</a></li><li class="chapter-item expanded "><a href="monitor/pidstat.html"><strong aria-hidden="true">2.3.</strong> pidstat</a></li><li class="chapter-item expanded "><a href="monitor/pgrep.html"><strong aria-hidden="true">2.4.</strong> pgrep</a></li><li class="chapter-item expanded "><a href="monitor/pmap.html"><strong aria-hidden="true">2.5.</strong> pmap</a></li><li class="chapter-item expanded "><a href="monitor/pstack.html"><strong aria-hidden="true">2.6.</strong> pstack</a></li></ol></li><li class="chapter-item expanded "><a href="trace_profile/index.html"><strong aria-hidden="true">3.</strong> Trace and Profile</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="trace_profile/strace.html"><strong aria-hidden="true">3.1.</strong> strace</a></li><li class="chapter-item expanded "><a href="trace_profile/ltrace.html"><strong aria-hidden="true">3.2.</strong> ltrace</a></li><li class="chapter-item expanded "><a href="trace_profile/perf.html"><strong aria-hidden="true">3.3.</strong> perf</a></li><li class="chapter-item expanded "><a href="trace_profile/oprofile.html"><strong aria-hidden="true">3.4.</strong> OProfile</a></li><li class="chapter-item expanded "><a href="trace_profile/time.html"><strong aria-hidden="true">3.5.</strong> time</a></li></ol></li><li class="chapter-item expanded "><a href="binary/index.html"><strong aria-hidden="true">4.</strong> Binary</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="binary/od.html"><strong aria-hidden="true">4.1.</strong> od</a></li><li class="chapter-item expanded "><a href="binary/xxd.html"><strong aria-hidden="true">4.2.</strong> xxd</a></li><li class="chapter-item expanded "><a href="binary/readelf.html"><strong aria-hidden="true">4.3.</strong> readelf</a></li><li class="chapter-item expanded "><a href="binary/objdump.html"><strong aria-hidden="true">4.4.</strong> objdump</a></li><li class="chapter-item expanded "><a href="binary/nm.html"><strong aria-hidden="true">4.5.</strong> nm</a></li></ol></li><li class="chapter-item expanded "><a href="development/index.html"><strong aria-hidden="true">5.</strong> Development</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="development/c++filt.html"><strong aria-hidden="true">5.1.</strong> c++filt</a></li><li class="chapter-item expanded "><a href="development/c++.html"><strong aria-hidden="true">5.2.</strong> c++</a></li><li class="chapter-item expanded "><a href="development/glibc.html"><strong aria-hidden="true">5.3.</strong> glibc</a></li><li class="chapter-item expanded "><a href="development/gcc.html"><strong aria-hidden="true">5.4.</strong> gcc</a></li><li class="chapter-item expanded "><a href="development/make.html"><strong aria-hidden="true">5.5.</strong> make</a></li><li class="chapter-item expanded "><a href="development/ld.so.html"><strong aria-hidden="true">5.6.</strong> ld.so</a></li><li class="chapter-item expanded "><a href="development/symbolver.html"><strong aria-hidden="true">5.7.</strong> symbol versioning</a></li><li class="chapter-item expanded "><a href="development/python.html"><strong aria-hidden="true">5.8.</strong> python</a></li></ol></li><li class="chapter-item expanded "><a href="linux/index.html"><strong aria-hidden="true">6.</strong> Linux</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="linux/systemd.html"><strong aria-hidden="true">6.1.</strong> systemd</a></li><li class="chapter-item expanded "><a href="linux/coredump.html"><strong aria-hidden="true">6.2.</strong> coredump</a></li><li class="chapter-item expanded "><a href="linux/ptrace_scope.html"><strong aria-hidden="true">6.3.</strong> ptrace_scope</a></li><li class="chapter-item expanded "><a href="linux/cryptsetup.html"><strong aria-hidden="true">6.4.</strong> cryptsetup</a></li><li class="chapter-item expanded "><a href="linux/swap.html"><strong aria-hidden="true">6.5.</strong> swap</a></li><li class="chapter-item expanded "><a href="linux/input.html"><strong aria-hidden="true">6.6.</strong> input</a></li></ol></li><li class="chapter-item expanded "><a href="network/index.html"><strong aria-hidden="true">7.</strong> Network</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="network/tcpdump.html"><strong aria-hidden="true">7.1.</strong> tcpdump</a></li><li class="chapter-item expanded "><a href="network/firewall-cmd.html"><strong aria-hidden="true">7.2.</strong> firewall-cmd</a></li><li class="chapter-item expanded "><a href="network/nftables.html"><strong aria-hidden="true">7.3.</strong> nftables</a></li></ol></li><li class="chapter-item expanded "><a href="web/index.html"><strong aria-hidden="true">8.</strong> Web</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="web/html.html"><strong aria-hidden="true">8.1.</strong> html</a></li><li class="chapter-item expanded "><a href="web/chartjs.html"><strong aria-hidden="true">8.2.</strong> chartjs</a></li></ol></li><li class="chapter-item expanded "><a href="arch/index.html"><strong aria-hidden="true">9.</strong> Arch</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="arch/x86_64.html"><strong aria-hidden="true">9.1.</strong> x86_64</a></li><li class="chapter-item expanded "><a href="arch/arm64.html"><strong aria-hidden="true">9.2.</strong> arm64</a></li><li class="chapter-item expanded "><a href="arch/armv7.html"><strong aria-hidden="true">9.3.</strong> armv7</a></li><li class="chapter-item expanded "><a href="arch/riscv.html"><strong aria-hidden="true">9.4.</strong> riscv</a></li></ol></li></ol>
+ <ol class="chapter"><li class="chapter-item expanded affix "><a href="intro.html">Introduction</a></li><li class="chapter-item expanded "><a href="tools/index.html"><strong aria-hidden="true">1.</strong> Tools</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="tools/zsh.html"><strong aria-hidden="true">1.1.</strong> zsh</a></li><li class="chapter-item expanded "><a href="tools/bash.html"><strong aria-hidden="true">1.2.</strong> bash</a></li><li class="chapter-item expanded "><a href="tools/fish.html"><strong aria-hidden="true">1.3.</strong> fish</a></li><li class="chapter-item expanded "><a href="tools/tmux.html"><strong aria-hidden="true">1.4.</strong> tmux</a></li><li class="chapter-item expanded "><a href="tools/git.html"><strong aria-hidden="true">1.5.</strong> git</a></li><li class="chapter-item expanded "><a href="tools/awk.html"><strong aria-hidden="true">1.6.</strong> awk</a></li><li class="chapter-item expanded "><a href="tools/emacs.html"><strong aria-hidden="true">1.7.</strong> emacs</a></li><li class="chapter-item expanded "><a href="tools/gpg.html"><strong aria-hidden="true">1.8.</strong> gpg</a></li><li class="chapter-item expanded "><a href="tools/gdb.html"><strong aria-hidden="true">1.9.</strong> gdb</a></li><li class="chapter-item expanded "><a href="tools/gdbserver.html"><strong aria-hidden="true">1.10.</strong> gdbserver</a></li><li class="chapter-item expanded "><a href="tools/radare2.html"><strong aria-hidden="true">1.11.</strong> radare2</a></li><li class="chapter-item expanded "><a href="tools/qemu.html"><strong aria-hidden="true">1.12.</strong> qemu</a></li><li class="chapter-item expanded "><a href="tools/pacman.html"><strong aria-hidden="true">1.13.</strong> pacman</a></li><li class="chapter-item expanded "><a href="tools/dot.html"><strong aria-hidden="true">1.14.</strong> dot</a></li></ol></li><li class="chapter-item expanded "><a href="monitor/index.html"><strong aria-hidden="true">2.</strong> Resource analysis & monitor</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="monitor/lsof.html"><strong aria-hidden="true">2.1.</strong> lsof</a></li><li class="chapter-item expanded "><a href="monitor/ss.html"><strong aria-hidden="true">2.2.</strong> ss</a></li><li class="chapter-item expanded "><a href="monitor/pidstat.html"><strong aria-hidden="true">2.3.</strong> pidstat</a></li><li class="chapter-item expanded "><a href="monitor/pgrep.html"><strong aria-hidden="true">2.4.</strong> pgrep</a></li><li class="chapter-item expanded "><a href="monitor/pmap.html"><strong aria-hidden="true">2.5.</strong> pmap</a></li><li class="chapter-item expanded "><a href="monitor/pstack.html"><strong aria-hidden="true">2.6.</strong> pstack</a></li></ol></li><li class="chapter-item expanded "><a href="trace_profile/index.html"><strong aria-hidden="true">3.</strong> Trace and Profile</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="trace_profile/strace.html"><strong aria-hidden="true">3.1.</strong> strace</a></li><li class="chapter-item expanded "><a href="trace_profile/ltrace.html"><strong aria-hidden="true">3.2.</strong> ltrace</a></li><li class="chapter-item expanded "><a href="trace_profile/perf.html"><strong aria-hidden="true">3.3.</strong> perf</a></li><li class="chapter-item expanded "><a href="trace_profile/oprofile.html"><strong aria-hidden="true">3.4.</strong> OProfile</a></li><li class="chapter-item expanded "><a href="trace_profile/time.html"><strong aria-hidden="true">3.5.</strong> time</a></li></ol></li><li class="chapter-item expanded "><a href="binary/index.html"><strong aria-hidden="true">4.</strong> Binary</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="binary/od.html"><strong aria-hidden="true">4.1.</strong> od</a></li><li class="chapter-item expanded "><a href="binary/xxd.html"><strong aria-hidden="true">4.2.</strong> xxd</a></li><li class="chapter-item expanded "><a href="binary/readelf.html"><strong aria-hidden="true">4.3.</strong> readelf</a></li><li class="chapter-item expanded "><a href="binary/objdump.html"><strong aria-hidden="true">4.4.</strong> objdump</a></li><li class="chapter-item expanded "><a href="binary/nm.html"><strong aria-hidden="true">4.5.</strong> nm</a></li></ol></li><li class="chapter-item expanded "><a href="development/index.html"><strong aria-hidden="true">5.</strong> Development</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="development/c++filt.html"><strong aria-hidden="true">5.1.</strong> c++filt</a></li><li class="chapter-item expanded "><a href="development/c++.html"><strong aria-hidden="true">5.2.</strong> c++</a></li><li class="chapter-item expanded "><a href="development/glibc.html"><strong aria-hidden="true">5.3.</strong> glibc</a></li><li class="chapter-item expanded "><a href="development/gcc.html"><strong aria-hidden="true">5.4.</strong> gcc</a></li><li class="chapter-item expanded "><a href="development/make.html"><strong aria-hidden="true">5.5.</strong> make</a></li><li class="chapter-item expanded "><a href="development/ld.so.html"><strong aria-hidden="true">5.6.</strong> ld.so</a></li><li class="chapter-item expanded "><a href="development/symbolver.html"><strong aria-hidden="true">5.7.</strong> symbol versioning</a></li><li class="chapter-item expanded "><a href="development/python.html"><strong aria-hidden="true">5.8.</strong> python</a></li><li class="chapter-item expanded "><a href="development/gcov.html"><strong aria-hidden="true">5.9.</strong> gcov</a></li></ol></li><li class="chapter-item expanded "><a href="linux/index.html"><strong aria-hidden="true">6.</strong> Linux</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="linux/systemd.html"><strong aria-hidden="true">6.1.</strong> systemd</a></li><li class="chapter-item expanded "><a href="linux/coredump.html"><strong aria-hidden="true">6.2.</strong> coredump</a></li><li class="chapter-item expanded "><a href="linux/ptrace_scope.html"><strong aria-hidden="true">6.3.</strong> ptrace_scope</a></li><li class="chapter-item expanded "><a href="linux/cryptsetup.html"><strong aria-hidden="true">6.4.</strong> cryptsetup</a></li><li class="chapter-item expanded "><a href="linux/swap.html"><strong aria-hidden="true">6.5.</strong> swap</a></li><li class="chapter-item expanded "><a href="linux/input.html"><strong aria-hidden="true">6.6.</strong> input</a></li></ol></li><li class="chapter-item expanded "><a href="network/index.html"><strong aria-hidden="true">7.</strong> Network</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="network/tcpdump.html"><strong aria-hidden="true">7.1.</strong> tcpdump</a></li><li class="chapter-item expanded "><a href="network/firewall-cmd.html"><strong aria-hidden="true">7.2.</strong> firewall-cmd</a></li><li class="chapter-item expanded "><a href="network/nftables.html"><strong aria-hidden="true">7.3.</strong> nftables</a></li></ol></li><li class="chapter-item expanded "><a href="web/index.html"><strong aria-hidden="true">8.</strong> Web</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="web/html.html"><strong aria-hidden="true">8.1.</strong> html</a></li><li class="chapter-item expanded "><a href="web/chartjs.html"><strong aria-hidden="true">8.2.</strong> chartjs</a></li></ol></li><li class="chapter-item expanded "><a href="arch/index.html"><strong aria-hidden="true">9.</strong> Arch</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="arch/x86_64.html"><strong aria-hidden="true">9.1.</strong> x86_64</a></li><li class="chapter-item expanded "><a href="arch/arm64.html"><strong aria-hidden="true">9.2.</strong> arm64</a></li><li class="chapter-item expanded "><a href="arch/armv7.html"><strong aria-hidden="true">9.3.</strong> armv7</a></li><li class="chapter-item expanded "><a href="arch/riscv.html"><strong aria-hidden="true">9.4.</strong> riscv</a></li></ol></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
</nav>
@@ -2618,6 +2618,7 @@ objdump -D -b binary -m i386:x86-64 test-bin
<li><a href="development/./ld.so.html">ld.so</a></li>
<li><a href="development/./symbolver.html">symbol versioning</a></li>
<li><a href="development/./python.html">python</a></li>
+<li><a href="development/./gcov.html">gcov</a></li>
</ul>
<div style="break-before: page; page-break-before: always;"></div><h1 id="cfilt1"><a class="header" href="#cfilt1">c++filt(1)</a></h1>
<h2 id="demangle-symbol"><a class="header" href="#demangle-symbol">Demangle symbol</a></h2>
@@ -2628,6 +2629,7 @@ objdump -D -b binary -m i386:x86-64 test-bin
<pre><code class="language-markdown"> readelf -W --dyn-syms &lt;elf&gt; | c++filt
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="c"><a class="header" href="#c">c++</a></h1>
+<p>Source files of most examples is available <a href="https://github.com/johannst/notes/tree/master/src/development/c%2B%2B">here</a>.</p>
<h2 id="type-deduction"><a class="header" href="#type-deduction">Type deduction</a></h2>
<p>Force compile error to see what <code>auto</code> is deduced to.</p>
<pre><code class="language-cpp">auto foo = bar();
@@ -2673,6 +2675,74 @@ int main() {
show(1, 1.0, &quot;foo&quot;, 'a');
}
</code></pre>
+<h2 id="forwarding-reference-fwd-ref"><a class="header" href="#forwarding-reference-fwd-ref">Forwarding reference (<a href="https://en.cppreference.com/w/cpp/language/reference#Forwarding_references">fwd ref</a>)</a></h2>
+<p>A <code>forwarding reference</code> is a special references that preserves the <code>value category</code> of a function parameter and therefore allows for <code>perfect</code>
+forwarding.</p>
+<p>A forwarding reference is a parameter of a function template, which is declared
+as <code>rvalue</code> reference to a <code>non-cv</code> qualified <code>type</code> template parameter.</p>
+<pre><code class="language-cpp">template&lt;typename T&gt;
+void fn(T&amp;&amp; param); // param is a forwarding reference
+</code></pre>
+<p>Perfect forwarding can be achieved with <a href="https://en.cppreference.com/w/cpp/utility/forward"><code>std::forward</code></a>. This for
+example allows a wrapper function to pass a parameter with the <strong>exact</strong> same
+value category to a down-stream function which is being invoked in the wrapper.</p>
+<pre><code class="language-cpp">#include &lt;cstdio&gt;
+#include &lt;utility&gt;
+
+struct M {};
+
+// -- CONSUMER -----------------------------------------------------------------
+
+void use(M&amp;) {
+ puts(__PRETTY_FUNCTION__);
+}
+
+void use(M&amp;&amp;) {
+ puts(__PRETTY_FUNCTION__);
+}
+
+// -- TESTER -------------------------------------------------------------------
+
+template&lt;typename T&gt;
+void wrapper(T&amp;&amp; param) { // forwarding reference
+ puts(__PRETTY_FUNCTION__);
+ // PARAM is an lvalue, therefore this always calls use(M&amp;).
+ use(param);
+}
+
+template&lt;typename T&gt;
+void fwd_wrapper(T&amp;&amp; param) { // forwarding reference
+ puts(__PRETTY_FUNCTION__);
+ // PARAM is an lvalue, but std::forward returns PARAM with the same value
+ // category as the forwarding reference takes.
+ use(std::forward&lt;T&gt;(param));
+}
+
+// -- MAIN ---------------------------------------------------------------------
+
+int main() {
+ {
+ std::puts(&quot;==&gt; wrapper rvalue reference&quot;);
+ wrapper(M{});
+ // calls use(M&amp;).
+
+ std::puts(&quot;==&gt; wrapper lvalue reference&quot;);
+ struct M m;
+ wrapper(m);
+ // calls use(M&amp;).
+ }
+ {
+ std::puts(&quot;==&gt; fwd_wrapper rvalue reference&quot;);
+ fwd_wrapper(M{});
+ // calls use(M&amp;&amp;).
+
+ std::puts(&quot;==&gt; fwd_wrapper lvalue reference&quot;);
+ struct M m;
+ fwd_wrapper(m);
+ // calls use(M&amp;).
+ }
+}
+</code></pre>
<h2 id="example-any_of-template-meta-function"><a class="header" href="#example-any_of-template-meta-function">Example: <code>any_of</code> template meta function</a></h2>
<pre><code class="language-cpp">#include &lt;type_traits&gt;
@@ -2755,7 +2825,9 @@ void Invoke(const Ctx&amp; C, P... params) {
// Custom context.
struct Ctx {
- void out(const char* s, unsigned v) const { printf(&quot;%s%x\n&quot;, s, v); }
+ void out(const char* s, unsigned v) const {
+ printf(&quot;%s%x\n&quot;, s, v);
+ }
};
// Operations to invoke.
@@ -2766,7 +2838,9 @@ struct OpA {
using Return = int;
static constexpr const char* const Name = &quot;OpA&quot;;
- constexpr Return operator()(int a, int b) const { return a + b; }
+ constexpr Return operator()(int a, int b) const {
+ return a + b;
+ }
};
template&lt;typename Ctx&gt;
@@ -2775,7 +2849,9 @@ struct OpB {
using Return = void;
static constexpr const char* const Name = &quot;OpB&quot;;
- Return operator()(const Ctx&amp; C, unsigned a) const { C.out(&quot;a = &quot;, a); }
+ Return operator()(const Ctx&amp; C, unsigned a) const {
+ C.out(&quot;a = &quot;, a);
+ }
};
int main() {
@@ -2812,7 +2888,9 @@ struct registry {
return r.second;
}
- R invoke(const std::string&amp; nm, P... p) const { return invoke_impl&lt;R&gt;(nm, p...); }
+ R invoke(const std::string&amp; nm, P... p) const {
+ return invoke_impl&lt;R&gt;(nm, p...);
+ }
void dump() const {
for (const auto&amp; it : m_fns) {
@@ -3074,6 +3152,88 @@ int main() {
// * No specialization matches, take the primary template.
}
</code></pre>
+<h1 id="example-perfect-forwarding"><a class="header" href="#example-perfect-forwarding">Example: Perfect forwarding</a></h1>
+<pre><code class="language-cpp">#include &lt;cassert&gt;
+#include &lt;cstdio&gt;
+#include &lt;new&gt;
+#include &lt;type_traits&gt;
+#include &lt;utility&gt;
+
+struct S {};
+
+struct M {
+ M() {
+ std::puts(&quot;M()&quot;);
+ }
+ M(const M&amp;) {
+ std::puts(&quot;M(M&amp;)&quot;);
+ }
+ M(M&amp;&amp;) {
+ std::puts(&quot;M(M&amp;&amp;)&quot;);
+ }
+ M&amp; operator=(const M&amp;) = delete;
+ M&amp; operator=(M&amp;&amp;) = delete;
+
+ M(S&amp;, int) {
+ std::puts(&quot;M(S&amp;)&quot;);
+ }
+ M(S&amp;&amp;, int) {
+ std::puts(&quot;M(S&amp;&amp;)&quot;);
+ }
+ ~M() {
+ std::puts(&quot;~M()&quot;);
+ }
+};
+
+template&lt;typename T&gt;
+struct option {
+ static_assert(!std::is_reference_v&lt;T&gt;);
+
+ constexpr option() = default;
+
+ template&lt;typename... Params&gt;
+ constexpr option(Params&amp;&amp;... params) : m_has_val(true) {
+ // BAD: does not perfectly forward!
+ // eg, if option(S&amp;&amp;) is invoked, this would invoke M(S&amp;).
+ // new (&amp;m_val) T(params...);
+
+ // GOOD: perfectly forwards params to constructor of T.
+ new (m_val) T(std::forward&lt;Params&gt;(params)...);
+ }
+
+ ~option() {
+ reset();
+ }
+
+ constexpr T&amp; value() {
+ assert(m_has_val);
+ return *reinterpret_cast&lt;T*&gt;(m_val);
+ }
+
+ private:
+ constexpr void reset() {
+ if (!m_has_val) {
+ return;
+ }
+ if constexpr (!std::is_trivially_destructible_v&lt;T&gt;) {
+ value().~T();
+ };
+ }
+
+ alignas(T) char m_val[sizeof(T)];
+ bool m_has_val{false};
+};
+
+int main() {
+ std::puts(&quot;==&gt; case 1&quot;);
+ // invokes M(S&amp;&amp;, int)
+ option&lt;M&gt; opt1(S{}, 123);
+
+ std::puts(&quot;==&gt; case 2&quot;);
+ // invokes M() + M(M&amp;&amp;)
+ option&lt;M&gt; x /* option(M&amp;&amp;) + M(M&amp;&amp;) */ = M{} /* M() */;
+}
+</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="glibc"><a class="header" href="#glibc">glibc</a></h1>
<h2 id="malloc-tracer-mtrace3"><a class="header" href="#malloc-tracer-mtrace3">malloc tracer <a href="http://man7.org/linux/man-pages/man3/mtrace.3.html"><code>mtrace(3)</code></a></a></h2>
<p>Trace memory allocation and de-allocation to detect memory leaks.
@@ -3115,6 +3275,8 @@ LD_PRELOAD=./libmtrace.so &lt;binary&gt;
<li><code>-dM</code> list only <code>#define</code> statements</li>
<li><code>-###</code> dry-run, outputting exact compiler/linker invocations</li>
<li><code>-print-multi-lib</code> print available multilib configurations</li>
+<li><code>--help=&lt;class&gt;</code> print description of cmdline options for given class, eg
+<code>warnings</code>, <code>optimizers</code>, <code>target</code>, <code>c</code>, <code>c++</code></li>
</ul>
<h3 id="target-options"><a class="header" href="#target-options">Target options</a></h3>
<pre><code class="language-bash"># List all target options with their description.
@@ -3123,6 +3285,15 @@ gcc --help=target
# Configure for current cpu arch and query (-Q) value of options.
gcc -march=native -Q --help=target
</code></pre>
+<h3 id="warnings--optimizations"><a class="header" href="#warnings--optimizations">Warnings / optimizations</a></h3>
+<pre><code class="language-bash"># List available warnings with short description.
+gcc --help=warnings
+# List available optimizations with short description.
+gcc --help=optimizers
+
+# Prepend --help with `-Q` to print wheter options are enabled or disabled
+# instead showing their description.
+</code></pre>
<h2 id="builtins"><a class="header" href="#builtins"><a href="https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html">Builtins</a></a></h2>
<h3 id="__builtin_expectexpr-cond"><a class="header" href="#__builtin_expectexpr-cond"><code>__builtin_expect(expr, cond)</code></a></h3>
<p>Give the compiler a hint which branch is hot, so it can lay out the code
@@ -3220,7 +3391,7 @@ aaa:
bbb:
</code></pre>
<p>Running above <code>Makefile</code> gives:</p>
-<pre><code class="language-test">@ = foobar
+<pre><code class="language-text">@ = foobar
&lt; = aaa
^ = aaa bbb
+ = aaa bbb bbb
@@ -3237,6 +3408,19 @@ bbb:
<ul>
<li><code>$(CURDIR)</code>: Path of current working dir after using <code>make -C path</code></li>
</ul>
+<h2 id="arguments"><a class="header" href="#arguments">Arguments</a></h2>
+<p>Arguments specified on the command line <em>override</em> ordinary variable
+assignments in the makefile (<a href="https://www.gnu.org/software/make/manual/html_node/Overriding.html">overriding variables</a>).</p>
+<pre><code class="language-make">VAR = abc
+all:
+ @echo VAR=$(VAR)
+</code></pre>
+<pre><code class="language-text"># make
+VAR=abc
+
+# make VAR=123
+VAR=123
+</code></pre>
<h2 id="useful-functions"><a class="header" href="#useful-functions">Useful functions</a></h2>
<h3 id="substitution-references"><a class="header" href="#substitution-references">Substitution references</a></h3>
<p>Substitute strings matching pattern in a list.</p>
@@ -3673,6 +3857,93 @@ def sum(a: int, b: int) -&gt; int:
<p>Micro benchmarking.</p>
<pre><code class="language-bash">python -m timeit '[x.strip() for x in [&quot;a &quot;, &quot; b&quot;]]'
</code></pre>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="gcov1"><a class="header" href="#gcov1">gcov(1)</a></h1>
+<p>Generate code coverage reports in text format.</p>
+<p>Compile the source files of interest and link the final binary with the
+following flags:</p>
+<ul>
+<li><code>-fprofile-arcs</code> instruments the generated code such that it writes a <code>.gcda</code>
+file when being executed with details about which branches are taken</li>
+<li><code>-ftest-coverage</code> writes a <code>.gcno</code> notes file which is used by <code>gcov</code> during
+generation of the coverage report</li>
+</ul>
+<p>Depending on the build environment one may also set <code>-fprofile-abs-path</code> to
+generate absolute path names into the <code>.gcno</code> note files, this can ease setups
+where compilations are done in different directories to the source directory.</p>
+<blockquote>
+<p><code>gcc</code> / <code>clang</code> also support an alias flag <code>--coverage</code> which during
+compilation time is equivalent to <code>-fprofile-arcs -ftest-coverage</code> and during
+link time <code>-lgcov</code>.</p>
+</blockquote>
+<p>After running the instrumented binary, the human readable report can then be
+generated for a single file for example such as</p>
+<pre><code class="language-shell">gcov &lt;SRC FILE | OBJ FILE&gt;
+</code></pre>
+<h2 id="example-6"><a class="header" href="#example-6">Example</a></h2>
+<pre><code class="language-cpp">#include &lt;cstdio&gt;
+
+void tell_me(int desc) {
+ if (desc &amp; 1) {
+ std::puts(&quot;this&quot;);
+ } else {
+ std::puts(&quot;that&quot;);
+ }
+}
+
+int main(int argc, char *argv[]) {
+ tell_me(argc);
+ tell_me(argc);
+ return 0;
+}
+</code></pre>
+<p>The <code>gcov</code> coverage report can be generated as follows for <code>gcc</code> or <code>clang</code>.</p>
+<pre><code class="language-make">CXXFLAGS = -fprofile-arcs -ftest-coverage
+# or the alias
+#CXXFLAGS = --coverage
+
+cov-gcc: clean
+ g++ $(CXXFLAGS) -c -o cov.o cov.cc
+ g++ $(CXXFLAGS) -o $@ cov.o
+ ./$@
+ gcov --demangled-names cov.cc
+ cat cov.cc.gcov
+.PHONY: cov-gcc
+
+cov-clang: clean
+ clang++ $(CXXFLAGS) -c -o cov.o cov.cc
+ clang++ $(CXXFLAGS) -o $@ cov.o
+ ./$@
+ llvm-cov gcov --demangled-names cov.cc
+ cat cov.cc.gcov
+.PHONY: cov-clang
+
+clean:
+ $(RM) *.gcov *.gcno *.gcda *.o cov-*
+</code></pre>
+<p>The will generate a report similar to the following.</p>
+<pre><code class="language-text">cat cov.cc.gcov
+ -: 0:Source:cov.cc
+ -: 0:Graph:cov.gcno
+ -: 0:Data:cov.gcda
+ -: 0:Runs:1
+ -: 1:// Copyright (C) 2023 johannst
+ -: 2:
+ -: 3:#include &lt;cstdio&gt;
+ -: 4:
+ 2: 5:void tell_me(int desc) {
+ 2: 6: if (desc &amp; 1) {
+ 2: 7: std::puts(&quot;this&quot;);
+ -: 8: } else {
+ #####: 9: std::puts(&quot;that&quot;);
+ -: 10: }
+ 2: 11:}
+ -: 12:
+ 1: 13:int main(int argc, char *argv[]) {
+ 1: 14: tell_me(argc);
+ 1: 15: tell_me(argc);
+ 1: 16: return 0;
+ -: 17:}
+</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="linux"><a class="header" href="#linux">Linux</a></h1>
<ul>
<li><a href="linux/./systemd.html">systemd</a></li>