我有一些我想模仿的硬件; 我想知道我是否可以在这样的低水平做到这一点.硬件有很多寄存器,我在一个结构中排列:
#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,并且一切都很简单(也许),但我想了解我是否可以以这种方式安排访问我的硬件.
在我的程序中,我有一个大的(例如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) 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在执行复制构造函数时,可能有人在另一个线程中进行了修改.如果是这样,编译器如何做到这一点?如果没有,我认为编译器无法保证复制构造函数是线程安全的,这太可怕了.
我试图在我的编译器(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) 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++版本(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今天就可以开始使用该名称,而不是稍后更改它.但是,这是危险/禁止的吗?clamp到std命名空间.这是UB,但可能会奏效.有没有缺点的方法?
是否有接受/习惯的方式这样做?
.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) 在Graph中找到localbridge(k)的最佳算法是什么?度k的局部桥是边缘,其移除将其两个端点之间的最短距离扩大到至少k.
您好我是这个网站的新手,我需要一些帮助来理解在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或整数值来存储长度)
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).