小编And*_*zos的帖子

错误纠正代码

我需要在短消息(100到200位之间)上使用纠错技术.可用于添加冗余位的空间限制为20-50%.

我将不得不在C/C++中实现编码和解码.所以它需要是开源的或足够容易编程.(我以前在解码算法方面有过一些经验 - 它们很可怕!)

任何人都可以建议使用合适的错误代码(使用相关参数)?

c c++ error-correction

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

C++ 11本地命名引用返回值(xvalue)?

我们有以下类型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)

c++ c++11

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

`[stack]`,`[vdso]`和`[vsyscall]`mmaps来自哪里?

考虑以下针对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它们的创建地点.

linux x86 linux-kernel vdso

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

非类名C++ 11类型名称是一个简单的模板ID?

在C++ 11标准它描述type-nameclass-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?)

c++ templates c++11

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

ARM Cortex A7在内核模式下返回PMCCNTR = 0,在用户模式下返回非法指令(即使在PMUSERENR = 1之后)

我想在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)

linux arm raspberry-pi raspberry-pi2

4
推荐指数
2
解决办法
1714
查看次数

跨翻译单元不一致的模板专业化状态?

请考虑以下程序:

档案啊

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 包含部分专业化而不是显式专业化,答案会有所不同吗?)

c++ language-lawyer c++20

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

确定指向常量的指针是否指向常量对象?

无论如何确定一个指向常量的指针是否指向一个常量对象?

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++ c++20

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

1.0 / 3.0 为何不是 C++ 中的未定义操作?(不能以浮点形式表示)

C++ 标准说:

如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。

二元 / 运算符将第一个表达式除以第二个表达式得出商。如果商 a/b 可以用结果类型表示 [snip];否则,a/b 的行为是未定义的。

如果我有:

double x = 1.0 / 3.0;
Run Code Online (Sandbox Code Playgroud)

1除以3的结果是实数“三分之一”。三分之一无法用结果类型表示(double,通常是 IEEE754 双精度二进制 64 浮点类型)。

这是否意味着上面的语句是一个未定义的操作?当然不可能——但我不明白为什么不是?

c++ floating-point language-lawyer c++20

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

Linux 3.0:"glibc检测到"中止 - 调整损坏检测功能?

我的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停止我的过程?它是如何工作的?这个腐败检测功能记录在哪里?它具有哪些可调参数以及如何在链接时和/或运行时访问它们?

c linux glibc

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

从中断返回时必须使用IRET吗?

IRET可以从堆栈中恢复寄存器,包括EFLAGS,ESP,EIP等,但我们也可以自己恢复寄存器.例如,"movl"可用于恢复%esp寄存器,"jmp"可以跳转指向存储在堆栈上的EIP的地址.

linux内核通过IRET从所有中断返回,这是一个权重指令.

一些内核操作(如上下文切换)经常发生.

IRET不是浪费吗?

linux x86 assembly operating-system linux-kernel

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