我想通过在Linux中使用内存映射I/O来尝试将文件的内容复制到另一个文件mmap().目的是自己检查一下这是否比使用更好fread(),fwrite()以及它如何处理大文件(例如,像几个GiB,因为文件被读取整个我想知道如果我需要有这么多的内存量).
这是我正在使用的代码:
// Open original file descriptor:
int orig_fd = open(argv[1], O_RDONLY);
// Check if it was really opened:
if (orig_fd == -1) {
fprintf(stderr, "ERROR: File %s couldn't be opened:\n", argv[1]);
fprintf(stderr, "%d - %s\n", errno, strerror(errno));
exit(EX_NOINPUT);
}
// Idem for the destination file:
int dest_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
// Check if it was really opened:
if (dest_fd == -1) {
fprintf(stderr, "ERROR: File %s couldn't be …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用C++(字面意思是我的第二天),并且我被分配来计算各种数据类型的范围,有符号和无符号.问题是,我的学校的工作方式我不会到数学部分,他教我们另外几个月的公式.他说要从那些已经完成数学课程的人那里得到这些信息,但他们都表示他们会在他们有笔记的家里从事这项工作.所以现在我和谷歌一起留在了黑暗中,而且它的答案是不确定的,所以我问你,堆栈溢出的聪明人.
获取数据类型范围的公式是什么?我发现一个有效但不适用于其他的INT,他希望我们计算的是:char,short,long和long long.他还想要那些4的无符号版本以及INT.
我们已经拥有每种数据类型的位和字节大小.
以下是我的INT范围布局:
printf ("\nThe range of int is: %f\n", pow(2, (sizeof(int) * CHAR_BIT) -1));
Run Code Online (Sandbox Code Playgroud) 以下代码是否保证正常终止并成功终止?
#include <assert.h>
struct foo_s {
union {
struct {
unsigned a : 10;
unsigned : 6;
};
struct {
unsigned : 10;
unsigned b : 6;
};
struct {
unsigned : 10;
unsigned c : 6;
};
};
};
int main () {
struct foo_s f;
f.a = 0;
f.b = 1;
assert(f.a == 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在回答不同的问题时,提出了这样的可能性,即在包含未命名的位字段的结构中对指定的位字段的赋值可能导致将任意数据写入这些位.C.11§6.7.2.112陈述:
没有声明符但只有冒号和宽度的位字段声明表示未命名的位字段.
我对此的解读是,未命名的位字段只是一个常规的位字段,唯一的区别是这些位中的值不能直接通过名称获得.是否允许使用"as-if"逻辑推断实现并在这些位中分配任意数据?
以前的情况是预增量是首选的,因为类上的重载后增量需要返回表示增量前对象状态的临时副本.
似乎这不再是一个严重的问题(只要内联就位),因为我的旧C++编译器(GCC 4.4.7)似乎将以下两个函数优化为相同的代码:
class Int {
//...
public:
Int (int x = 0);
Int & operator ++ ();
Int operator ++ (int) {
Int x(*this);
++*this;
return x;
}
};
Int & test_pre (Int &a) {
++a;
return a;
}
Int & test_post (Int &a) {
a++;
return a;
}
Run Code Online (Sandbox Code Playgroud)
两个函数的结果汇编是:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
pushq %rbx
.cfi_def_cfa_offset 16
.cfi_offset 3, -16
movq %rdi, %rbx
call _ZN3IntppEv
movq %rbx, %rax
popq %rbx
.cfi_def_cfa_offset 8
ret
.cfi_endproc
Run Code Online (Sandbox Code Playgroud)
然而,如果没有任何内联,那么优先选择预增量到后增量似乎仍然有好处,因为它
test_post被强制调用operator++(int). …
似乎如果我有一个转换运算符到一个引用,这个运算符将优先于转换为a bool.为什么会发生这种情况,我该如何解决?
(如果重要的话,我正在使用GCC 4.5.我在ideone上验证了GCC-4.7.2发现了相同的行为.)
假设如下:
class B {
protected:
const int a_;
int b_;
B (int b, int a) : a_(a), b_(b) {}
public:
operator bool () const { return b_ == a_; }
};
class D1 : public B {
public:
D1 (int b = 0, int a = 0) : B(b, a) {}
operator int () const { return b_; }
};
class D2 : public B {
public:
D2 (int b = 0, int a = …Run Code Online (Sandbox Code Playgroud) 我想强制字符串在运行时通过汇编指令动态分配到局部变量,而字符串不占用数据部分中的内存(例如只读数据部分).
以下似乎完美地运作:
char foo[] = "bar";
Run Code Online (Sandbox Code Playgroud)
汇编代码变为:
movl $7496034, 40(%esp)
Run Code Online (Sandbox Code Playgroud)
因此,在运行时通过指令foo初始化."bar"movl
如何强制它在所有字符串操作中发生?
例如,如果我将字符串文字传递给函数:
testfunc("bar");
Run Code Online (Sandbox Code Playgroud)
"bar"在这种情况下,字符串将在一个部分中分配.
我刚才读到:C维基百科条目.据我所知,有三种不同版本的C被广泛使用:C89,C99和C11.我的问题涉及不同版本的源代码的兼容性.假设我要编写一个程序(在C11中,因为它是最新版本)并导入一个用C89编写的库.根据C11规范编译所有文件时,这两个版本是否能够正常工作?
问题1:较新版本的C即旧C版本的C99,C11超集?我认为,超集我的意思是,根据较新的C规范编译时,旧代码将编译时没有错误和相同的含义.
我刚才读到,//在C89和C99中有不同的含义.除了这个功能,还是C89的C99和C11超集?
如果问题1的答案是否定的,那么我又得到了2个问题.
如何将旧代码"移植"到新版本?有没有解释这个程序的文件?
使用C89或C99或C11更好吗?
感谢您的帮助.
编辑:将ISO C更改为C89.
有时文件中的某些代码没有任何扩展名.这些文件将使用单一语言编写代码,但每个此类文件可以使用不同的语言编写(例如,C,C++,汇编语言,wiki标记和HTML).同样,当文件名中有一个公共扩展名时,也会出现问题,但不同的文件使用不同的编程语言.
我想解决的问题是避免让已经签出工作区的每个开发人员不必弄清楚源文件是什么类型的文件(没有扩展名,或者扩展名不暗示使用的源语言) .为此,文件的作者有责任在文件中放置正确的魔法,以便正确打开文件.由于Eclipse能够根据文件中的某些嵌入文本禁用格式化程序,因此我认为应该可以指定文件类型.该Open With功能允许单个开发人员更改文件的解释方式,但每次签出新工作区时都必须再次执行此操作.
在Emacs或Vim中,我可以将魔术字符串放在文件的顶部,以指示我希望如何在编辑器中呈现文件.例如:
/* -*- c++ -*- */
/* vim: set ft=cpp: */
Run Code Online (Sandbox Code Playgroud)
Eclipse有一些等效的魔力吗?我寻找解决方案的尝试不断指出如何禁用格式化程序.显然,我对Eclipse的经验不足,限制了我的Google-Fu.
C++标准对sizeof(std::array<char, N>)应该是什么(对于某些常量N)说了些什么?
在对不同问题的评论中,提到std::array并不总是"堆栈分配".该评论是对一个不同的评论的回应,该评论推测将过大的常量std::array声明为局部变量可能导致程序因"资源分配"变量的资源不足而中止.我假设后续评论意味着有可能std::array以某种方式切换到动态分配模式.
我可以想象,可能会有某种SFINAE应用于数组大小阈值,触发std::array实际动态分配数组并对其进行管理的特化.在这种情况下,sizeof(std::array<...>)可能只是指针的大小.这是允许发生的吗?
好的,我正在使用g ++ 4.8.2并且有以下(有点长)代码,它获取有关不完整类型的错误消息.我已将代码缩减为较小的块以包含在此处,并且可以直接编译:
#include <cstdlib>
struct S
{
void method(){}
};
template<size_t sz, size_t tot>
class genpool
{
};
template <class T>
class mempool
{
private:
genpool<sizeof(T), 10*sizeof(T)> p;
};
template <class obj, class mthd>
class functor
{
private:
static mempool<functor<obj, mthd> > pool;
};
template <class obj, class mthd>
mempool<functor<obj, mthd> > functor<obj, mthd>::pool;
int main()
{
typedef void (S::*m)();
typedef functor<S, m> fctr;
fctr f;
}
Run Code Online (Sandbox Code Playgroud)
编译器错误消息是:
g++ jj.C
jj.C: In instantiation of ‘class mempool<functor<S, void (S::*)()> >’: …Run Code Online (Sandbox Code Playgroud)