小编ana*_*lyg的帖子

如何模拟内存映射的I/O.

我有一些我想模仿的硬件; 我想知道我是否可以在这样的低水平做到这一点.硬件有很多寄存器,我在一个结构中排列:

#include <stdint.h>
struct MyControlStruct
{
    uint32_t data_reg_1;
    uint32_t data_reg_2;
    uint32_t dummy[2]; // to make the following registers have certain addresses
    uint32_t control_reg_1;
    uint32_t control_reg_2;
};
volatile struct MyControlStruct* MyDevice = (struct MyControlStruct*)0xDeadF00;
Run Code Online (Sandbox Code Playgroud)

所以,我想在Windows和Linux上支持以下硬件访问语法:

MyDevice->data_reg_1 = 42;
MyDevice->data_reg_2 = 100;
MyDevice->control_reg_1 = 1;
Run Code Online (Sandbox Code Playgroud)

当最后一行代码执行时,我希望硬件模拟器"唤醒"并做一些事情.我可以在Windows和/或Linux上实现这个吗?我想过以某种方式捕获"分段故障"信号,但不确定这是否可以在Windows上完成,或者根本不能.

我查看了手册页mmap; 它似乎可以帮助,但我无法理解我如何使用它.

当然,我可以通过定义类似的函数来抽象对硬件的访问WriteToMyDevice,并且一切都很简单(也许),但我想了解我是否可以以这种方式安排访问我的硬件.

c hardware-interface memory-mapping

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

如何在Matlab中对结构进行"引用"?

在我的程序中,我有一个大的(例如100x100)结构数组,每个结构都有相当数量的数据(例如1000个数字,以及其他一些字段).例如:

for x = 100 : -1 : 1
    for y = 100 : -1 : 1
        database(y,x).data = rand(30);
        database(y,x).name = sprintf('my %d %d', x, y);
    end
end
Run Code Online (Sandbox Code Playgroud)

我想用我的数据计算10-20行代码; 例如:

for x = 10 : 90
    for y = 10 : 90
        for dx = -9 : 9
            for dy = -9 : 9
                result = result + database(y + dy, x + dx).data(1, 1);
                result = result + 2 * database(y + dy, x + dx).data(1, 2) * …
Run Code Online (Sandbox Code Playgroud)

performance matlab reference

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

c ++中的默认复制构造函数是否是线程安全的?

class CSample{
     int a;
     // ..... lots of fields
}
Csample c;
Run Code Online (Sandbox Code Playgroud)

我们知道,Csample有一个默认的复制构造函数.当我这样做:

Csample d = c
Run Code Online (Sandbox Code Playgroud)

将发生默认的复制构造函数.我的问题是:它是线程安全的吗?因为c在执行复制构造函数时,可能有人在另一个线程中进行了修改.如果是这样,编译器如何做到这一点?如果没有,我认为编译器无法保证复制构造函数是线程安全的,这太可怕了.

c++ multithreading copy-constructor

7
推荐指数
3
解决办法
1297
查看次数

为什么MSVC的自动矢量化不使用AVX2?

我试图在我的编译器(Microsoft Visual Studio 2013)中使用矢量化.我面临的一个问题是它不想使用AVX2.在研究这个问题时,我构建了以下示例,它计算了16个数字的总和,每个数字为16位.

int16_t input1[16] = {0};
int16_t input2[16] = {0};
... // fill the arrays with some data

// Calculate the sum using a loop
int16_t output1[16] = {0};
for (int x = 0; x < 16; x++){
    output1[x] = input1[x] + input2[x];
}
Run Code Online (Sandbox Code Playgroud)

编译器将此代码矢量化,但仅限于SSE指令:

vmovdqu  xmm1, xmmword ptr [rbp+rax]
lea      rax, [rax+10h]
vpaddw   xmm1, xmm1, xmmword ptr [rbp+rax+10h]
vmovdqu  xmmword ptr [rbp+rax+30h], xmm1
dec      rcx
jne      main+0b0h
Run Code Online (Sandbox Code Playgroud)

为了确保编译器具有生成AVX2代码的选项,我编写了如下相同的计算:

// Calculate the sum using one AVX2 instruction
int16_t …
Run Code Online (Sandbox Code Playgroud)

c c++ vectorization avx2 visual-studio-2013

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

为什么我不能在模板化的类中内联定义非模板化的朋友?

MCVE的言辞胜于雄辩:

// int bar();
template <bool B> class Foo {
    friend int ::bar() { return 123; }
};

int main()
{
    Foo<false> f1;
    Foo<true> f2;
}
Run Code Online (Sandbox Code Playgroud)

与GCC 6 --std=c++14,这给了我:

a.cpp: In instantiation of ‘class Foo<true>’:
a.cpp:9:12:   required from here
a.cpp:3:13: error: redefinition of ‘int bar()’
  friend int ::bar() { return 123; }
             ^~
a.cpp:3:13: note: ‘int bar()’ previously defined here
Run Code Online (Sandbox Code Playgroud)

现在,我不确定标准是什么意思; 但是我知道编译器知道朋友没有模板化B,也没有使用它的定义B.那么为什么它不能应用"哦,函数的相同定义的所有内联副本是相同的"规则?

c++ templates inline friend language-lawyer

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

如何定义将在下一版标准库中实现的功能?

我需要将在下一个C++版本(C++ 17)中添加的功能.我正在使用MS Visual Studio,它实现了C++ 11.我希望在几年后我会升级我的编译工具,因此可以通过标准库获得此功能.

与此同时,我需要手动实现它.我如何定义它以便将来很容易迁移?

我们std::clamp以此为例.

  • 我可以使用不同的名称来实现它,例如my_clamp.当我能够使用C++ 17,我可以开始使用std::clamp,以及可选做全局替换的my_clamp通过std::clamp.这看起来很难看,但可能不会产生任何意外.
  • 我可以在我的命名空间中实现它my::std,并且可以using namespace my.这样,我std::clamp今天就可以开始使用该名称,而不是稍后更改它.但是,这是危险/禁止的吗?
  • 我可以以某种方式检测C++版本,如果它小于17,则填充clampstd命名空间.这是UB,但可能会奏效.

有没有缺点的方法?

是否有接受/习惯的方式这样做?

c++ compatibility

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

使用配置文件禁用或启用 cppcheck 警告

.clang-tidy使用 clang-tidy 静态分析器,我可以在项目的根目录中 保留一个文件 ( ),其中包含我想要激活或停用的警告。clang-tidy将查找此文件(据我所知)并使用其中定义的选项。这使我不必在 CMake 或 Makefile 中对长命令行进行硬编码。

cppcheck静态分析器可以做同样的事情吗?

目前我有这个很长的命令行硬编码:

cppcheck --max-ctu-depth=3 --enable=all --inline-suppr --suppress=*:*thrust/complex* --suppress=missingInclude --suppress=syntaxError --suppress=unmatchedSuppression --suppress=preprocessorErrorDirective --language=c++ --std=c++14 --error-exitcode=666
Run Code Online (Sandbox Code Playgroud)

.clang-tidy这是我保存在项目根目录下的配置文件示例:

---
Checks: '
    *,
    -readability-magic-numbers,
    -modernize-use-nodiscard,
    -altera-struct-pack-align,
    -cert-err58-cpp,
    -cppcoreguidelines-avoid-non-const-global-variables,
    -cppcoreguidelines-macro-usage,
    -cppcoreguidelines-pro-bounds-array-to-pointer-decay,
    -cppcoreguidelines-pro-type-vararg,
    -cppcoreguidelines-avoid-magic-numbers,
    -fuchsia-default-arguments-calls,
    -fuchsia-trailing-return,
    -fuchsia-statically-constructed-objects,
    -fuchsia-overloaded-operator,
    -hicpp-vararg,
    -hicpp-no-array-decay,
    -llvm-header-guard,
    -llvmlibc-restrict-system-libc-headers,
    -llvmlibc-implementation-in-namespace,
    -llvmlibc-callee-namespace
'
WarningsAsErrors: '*'
HeaderFilterRegex: '.'
AnalyzeTemporaryDtors: false
FormatStyle: file
...
Run Code Online (Sandbox Code Playgroud)

c++ configuration-files cppcheck clang-tidy

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

Graph中的k度的LocalBridge

在Graph中找到localbridge(k)的最佳算法是什么?度k的局部桥是边缘,其移除将其两个端点之间的最短距离扩大到至少k.

维基百科:http://en.wikipedia.org/wiki/Bridge_(人际)#Local_bridge

algorithm graph-theory data-structures

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

我应该如何在C结构中声明字符串?

您好我是这个网站的新手,我需要一些帮助来理解在C中编码需要字符串的结构时会被视为"规范"的内容.基本上我想知道在使用C中的结构来跟踪结构所需的所有内存时,下列哪种方式将被视为"行业标准":

1)固定尺寸字符串:

typedef struct
{
    int damage;
    char name[40];
} Item;
Run Code Online (Sandbox Code Playgroud)

我现在可以使用 sizeof(Item)

2)字符数组指针

typedef struct
{
    int damage;
    char *name;
} Item;
Run Code Online (Sandbox Code Playgroud)

我知道我可以存储name使用第二个变量的大小,但还有另一种方法吗?

i)使用固定尺寸是否有任何其他优势(1)

char name[40];
Run Code Online (Sandbox Code Playgroud)

与执行以下操作并使用指向char数组的指针(2)?

char *name;
Run Code Online (Sandbox Code Playgroud)

如果是的话,有什么好处?

ii)此外,字符串是否使用指向char数组(2)的指针将按顺序存储在结构之后(紧接在指向字符串的指针之后),还是存储在内存中的其他位置?

iii)我想知道如何找到char *字符串变量的长度(不使用a size_t或整数值来存储长度)

c arrays string pointers

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

如何将指定行数作为输入?

cin>>string输入直到空格或新线.但getline(cin,string)需要输入直到换行.再次,getline(cin,string,'c')输入直到'c'.有没有办法忽略一些'\n'字符并将指定数量的行作为输入?

我尝试了下面的代码,但它没有用

int main()
{
   string a;
   for(int i=0;i<4;i++)
   {
       getline(cin,a);//take string input 
   }
   cout<<a;
}
Run Code Online (Sandbox Code Playgroud)

这里有以下输入

 ksafj kfaskjf(\n)1st
 uuiiuo akjfksad(\n)2nd
 ksafj kasfj(\n)3rd
 asdfed kkkl(\n) when the 4th enter comes input terminate
Run Code Online (Sandbox Code Playgroud)

字符串a只有"asdfed kkkl".我希望它能容纳所有字符,包括行尾(\n).

c++ string

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