小编Arr*_*kis的帖子

C/C++多维数组内部

我有一个关于C/C++如何在内部存储使用符号声明的多维数组的问题foo[m][n].我不是在质疑指针的纯指针等等......因为速度原因,我在问...

如果我错了,请纠正我,但语法上foo是一个指针数组,它们本身指向一个数组

int foo[5][4]
*(foo + i)           // returns a memory address
*( *(foo + i) + j)    // returns an int
Run Code Online (Sandbox Code Playgroud)

我从很多地方听说过C/C++编译器foo[m][n]在幕后转换为一维数组(计算所需的一维索引i * width + j).但是如果这是真的那么以下就可以了

*(foo + 1)          // should return element foo[0][1]
Run Code Online (Sandbox Code Playgroud)

因此我的问题foo[m][n]是:(总是吗?)存储在内存中作为平面一维数组是真的吗?如果是这样,为什么上面的代码如图所示.

c

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

函数声明中的静态关键字在函数定义中可能会丢失吗?

我希望有一个静态函数,我在定义之前在我的.c文件中声明:

//file a.c version 1
static int foo();
...
static int foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)

但是,似乎我可以将static关键字从函数定义中删除,并且我没有得到编译器警告......例如

//file a.c version 2
static int foo();
...
int foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)

假设这两种形式完全相同,我是否正确?
如果是这样,为什么允许这种差异,我应该使用哪种形式?

c c++ static declaration function

11
推荐指数
1
解决办法
7321
查看次数

返回值或修改引用传递的参数是否更快?

在我写的程序中,我必须在函数之间传递大型数据结构(图像).我需要在不同的操作系统上尽可能快地使用我的代码(因此,我无法分析所有测试用例).我经常有表格的代码......

void foo() {
  ImageType img = getCustomImage();
}

ImageType getCustomImage() {
  ImageType custom_img;
  //lots of code
  return custom_img;
}
Run Code Online (Sandbox Code Playgroud)

AFAIK,该行将ImageType img = getCustomImage();导致调用复制构造函数img,返回值为custom_img其参数.维基百科说,一些编译器甚至会再次执行此操作,作为初始临时变量!

我的问题:通过使用pass by reference而不是返回值来绕过这种开销(图像的复制构造函数是昂贵的)通常会更快吗?

void foo() {
  ImageType img;
  getCustomImage(img);
}

void getCustomImage(ImageType &img) {
  //code operating directly on img
}
Run Code Online (Sandbox Code Playgroud)

我被告知如果编译器支持返回值优化,那么应该没有区别.这是真的?我现在可以(在合理范围内)假设这一点,当速度很重要时,我应该如何构建我的程序

c++ return-value-optimization

9
推荐指数
1
解决办法
2861
查看次数

配置Emacs Flymake直接调用g ++

在编写简单的一个文件C++代码时,我通常直接调用g ++.默认情况下,Flymake似乎假设存在带有检查语法目标的Makefile.如何配置Flymake直接调用g ++,例如:

g++ -c a.cpp
Run Code Online (Sandbox Code Playgroud)

如果可以修改答案以包含编译器标志,那就更好了

非常感谢

emacs flymake

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