我有一个关于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文件中声明:
//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)
假设这两种形式完全相同,我是否正确?
如果是这样,为什么允许这种差异,我应该使用哪种形式?
在我写的程序中,我必须在函数之间传递大型数据结构(图像).我需要在不同的操作系统上尽可能快地使用我的代码(因此,我无法分析所有测试用例).我经常有表格的代码......
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++代码时,我通常直接调用g ++.默认情况下,Flymake似乎假设存在带有检查语法目标的Makefile.如何配置Flymake直接调用g ++,例如:
g++ -c a.cpp
Run Code Online (Sandbox Code Playgroud)
如果可以修改答案以包含编译器标志,那就更好了
非常感谢