我需要在短消息(100到200位之间)上使用纠错技术.可用于添加冗余位的空间限制为20-50%.
我将不得不在C/C++中实现编码和解码.所以它需要是开源的或足够容易编程.(我以前在解码算法方面有过一些经验 - 它们很可怕!)
任何人都可以建议使用合适的错误代码(使用相关参数)?
我们有以下类型X和功能f:
struct X { ... };
X f() { ... };
Run Code Online (Sandbox Code Playgroud)
现在考虑另一个函数的三个替代定义g:
(1)
void g()
{
X x = f();
...
}
Run Code Online (Sandbox Code Playgroud)
(2)
void g()
{
X& x = f();
...
}
Run Code Online (Sandbox Code Playgroud)
(3)
void g()
{
X&& x = f();
...
}
Run Code Online (Sandbox Code Playgroud)
三种不同情况之间定义的行为(或潜在行为)有何不同?(假设三个案例中的占位符'...'代码相同)
更新:
如果g退回如果X:以下是合法且正确的吗?
X g()
{
X&& x = f();
...
return move(x);
}
Run Code Online (Sandbox Code Playgroud)
(移动是否必要,是否有任何作用?)
您是否期望RVO链接以便下面会产生相同的代码?
X g()
{
X x = f();
...
return x;
}
Run Code Online (Sandbox Code Playgroud) 考虑以下针对Linux x86_64的程序:
inf.s:
.global _start
.text
_start:
jmp _start
Run Code Online (Sandbox Code Playgroud)
这基本上是一个无限循环.
如果我链接并删除它,我得到一个ELF可执行文件:
$ gcc -nostdlib inf.s
$ ./a.out &
[1] 15862
$ cat /proc/15862/maps
00400000-00401000 r-xp 00000000 fc:00 11404632 a.out
7fffacdb8000-7fffacdd9000 rwxp 00000000 00:00 0 [stack]
7fffacddd000-7fffacdde000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Run Code Online (Sandbox Code Playgroud)
在ELF可执行文件中,第一个程序头LOAD包含占上述mmaps(a.out)中第一个条目的映射.(即使我删除每个,但是这个头和代码都会观察到相同的映射.) execve(2)调用ELF处理程序,fs/binfmt_elf.c其中读取程序头并在文件上调用mmap.
我不明白的是其他三个来自哪里(stack,vdso,vsyscall).它们未在ELF文件中提及,因此Linux内核必须默认设置这三个"匿名"或"特殊"映射.
我的问题是内核代码(或如何)Linux内核创建其他三个映射?他们是否继承了这个人?我似乎无法看到fs/exec.c它们的创建地点.
在C++ 11标准它描述type-name和class-name具有以下语法:
type-name:
class-name
enum-name
typedef-name
simple-template-id <--- HERE
class-name:
identifier
simple-template-id
Run Code Online (Sandbox Code Playgroud)
我的问题是关于simple-template-id那是直系后裔type-name.
是否有可能拥有simple-template-id一个type-name但不是一个class-name?
例如,如果foo<bar>名称是一个类型,它可以是非类型吗?
(如果答案是否定的,是否有其他原因我错过了为什么simple-template-id重复type-name?)
我想在Raspberry Pi 2上读取循环计数寄存器(PMCCNTR),它有一个ARM Cortex A7内核.我为它编译了一个内核模块,如下所示:
#include <linux/module.h>
#include <linux/kernel.h>
int init_module()
{
volatile u32 PMCR, PMUSERENR, PMCCNTR;
// READ PMCR
PMCR = 0xDEADBEEF;
asm volatile ("mrc p15, 0, %0, c9, c12, 0\n\t" : "=r" (PMCR));
printk (KERN_INFO "PMCR = %x\n", PMCR);
// READ PMUSERENR
PMUSERENR = 0xDEADBEEF;
asm volatile ("mrc p15, 0, %0, c9, c14, 0\n\t" : "=r" (PMUSERENR));
printk (KERN_INFO "PMUSERENR = %x\n", PMUSERENR);
// WRITE PMUSERENR = 1
asm volatile ("mcr p15, 0, %0, c9, c14, 0\n\t" : …Run Code Online (Sandbox Code Playgroud) 请考虑以下程序:
档案啊
template <typename T> struct C { static constexpr int x = 42; };
Run Code Online (Sandbox Code Playgroud)
文件 BH
#include "A.H"
template <> struct C<int> { static constexpr int x = 43; };
Run Code Online (Sandbox Code Playgroud)
文件 A.CC
#include "A.H"
void a() { std::cout << C<int>::x; }
Run Code Online (Sandbox Code Playgroud)
文件 B.CC
#include "B.H"
void b() { std::cout << C<int>::x; }
Run Code Online (Sandbox Code Playgroud)
文件主.CC
void a(); void b();
int main() { a(); b(); }
Run Code Online (Sandbox Code Playgroud)
这个程序的状态如何?它是格式错误的,格式错误的,不需要诊断,是否表现出未定义的行为,或者以上都没有(没关系)?
如果以上都不是,程序的输出是什么?
如果是上述之一,它违反了什么规则?
(此外,如果 BH 包含部分专业化而不是显式专业化,答案会有所不同吗?)
无论如何确定一个指向常量的指针是否指向一个常量对象?
bool is_const_object(const int* p) {
return ???;
}
int main() {
int x = 42;
const int y = 43;
assert(!is_const_object(&x));
assert(is_const_object(&y));
}
Run Code Online (Sandbox Code Playgroud) C++ 标准说:
如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。
和
二元 / 运算符将第一个表达式除以第二个表达式得出商。如果商 a/b 可以用结果类型表示 [snip];否则,a/b 的行为是未定义的。
如果我有:
double x = 1.0 / 3.0;
Run Code Online (Sandbox Code Playgroud)
1除以3的结果是实数“三分之一”。三分之一无法用结果类型表示(double,通常是 IEEE754 双精度二进制 64 浮点类型)。
这是否意味着上面的语句是一个未定义的操作?当然不可能——但我不明白为什么不是?
我的Linux 3.0/glibc 2.13应用程序因以下形式的错误而停止:
*** glibc detected *** MYAPP: double free or corruption (fasttop): 0x000000000164fef0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x78a96)[0x7f9b114d4a96]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x6c)[0x7f9b114d8d7c]
MYAPP(...+0x131)[0x44e4c1]
MYAPP(...+0x3e8)[0x4441d8]
MYAPP(...+0x61)[0x440e41]
Run Code Online (Sandbox Code Playgroud)
我的问题不是导致这个问题的错误.
我的问题是什么"腐败检测"功能是glibc停止我的过程?它是如何工作的?这个腐败检测功能记录在哪里?它具有哪些可调参数以及如何在链接时和/或运行时访问它们?
IRET可以从堆栈中恢复寄存器,包括EFLAGS,ESP,EIP等,但我们也可以自己恢复寄存器.例如,"movl"可用于恢复%esp寄存器,"jmp"可以跳转指向存储在堆栈上的EIP的地址.
linux内核通过IRET从所有中断返回,这是一个权重指令.
一些内核操作(如上下文切换)经常发生.
IRET不是浪费吗?