相关疑难解决方法(0)

通过引用传递数组

如何通过引用传递静态分配的数组?

void foo(int (&myArray)[100])
{
}

int main()
{
    int a[100];
    foo(a);
}
Run Code Online (Sandbox Code Playgroud)

是否(&myArray)[100]有任何意义或只是通过引用传递任何数组的语法?我不明白单独的括号后跟大括号.谢谢.

c++ arrays

166
推荐指数
5
解决办法
33万
查看次数

为什么声明一个只包含C中数组的结构?

我遇到了一些包含以下内容的代码:

struct ABC {
    unsigned long array[MAX];
} abc;
Run Code Online (Sandbox Code Playgroud)

何时使用这样的声明是有意义的?

c arrays struct coding-style

129
推荐指数
5
解决办法
6988
查看次数

如何从GCC /铿锵声组件输出中消除"噪音"?

我想检查boost::variant在我的代码中应用的程序集输出,以便查看哪些中间调用被优化掉了.

当我编译以下示例(使用GCC 5.3 g++ -O3 -std=c++14 -S)时,似乎编译器优化了所有内容并直接返回100:

(...)
main:
.LFB9320:
    .cfi_startproc
    movl    $100, %eax
    ret
    .cfi_endproc
(...)
Run Code Online (Sandbox Code Playgroud)
#include <boost/variant.hpp>

struct Foo
{
    int get() { return 100; }
};

struct Bar
{
    int get() { return 999; }
};

using Variant = boost::variant<Foo, Bar>;


int run(Variant v)
{
    return boost::apply_visitor([](auto& x){return x.get();}, v);
}
int main()
{
    Foo f;
    return run(f);
}
Run Code Online (Sandbox Code Playgroud)

但是,完整的程序集输出包含的内容远远超过上面的摘录,对我而言,它看起来永远不会被调用.有没有办法告诉GCC/clang删除所有"噪音"并输出程序运行时实际调用的内容?


完整装配输出:

    .file   "main1.cpp"
    .section    .rodata.str1.8,"aMS",@progbits,1
    .align 8
.LC0:
    .string "/opt/boost/include/boost/variant/detail/forced_return.hpp"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC1: …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc clang

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

C对阵列的厌恶

在关于C的介绍性书籍中,经常声称指针或多或少数组.充其量只是一个巨大的简化吗?

存在 C中的数组类型,它可以表现从指针完全不同的,例如:

#include <stdio.h>

int main(int argc, char *argv[]){
  int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  int *b = a;
  printf("sizeof(a) = %lu\n", sizeof(a));
  printf("sizeof(b) = %lu\n", sizeof(b));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出输出

sizeof(a) = 40 
sizeof(b) = 8 
Run Code Online (Sandbox Code Playgroud)

或者作为另一个例子a = b会产生编译错误(GCC:"赋值给带数组类型的表达式").

当然,指针和数组之间存在密切关系,在某种意义上,数组变量本身的内容是第一个数组元素的内存地址,例如int a[10] = {777, 1, 2, 3, 4, 5, 6, 7, 8, 9}; printf("a = %ul\n", a);打印包含777的地址.

现在,一方面,如果你在结构中"隐藏"数组,只需使用=运算符就可以轻松复制大量数据(数组,如果忽略包装结构)(这甚至也很快):

#include …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers language-concepts

6
推荐指数
2
解决办法
418
查看次数

根据AMD64 ABI,什么样的C11数据类型是阵列

我正在研究在OSX上使用的x86_64的调用约定,并且在System V x86-64 ABI标准中阅读了名为"Aggregates and Unions"的部分.它提到了数组,我认为这就像一个固定长度的c数组,例如int[5].

我下到"3.2.3参数传递"来读取数组如何通过,如果我正确理解,uint8_t[3]应该在寄存器中传递一些东西,因为它小于聚合分类规则1规定的四个八字节限制类型(靠近底部的第18页).

编译后我看到它被作为指针传递.(我正在使用OSX 10.11.6上的Xcode 7.3.1中的clang-703.0.31进行编译).

我用来编译的示例源如下:

#include <stdio.h>

#define type char

extern void doit(const type[3]);
extern void doitt(const type[5]);
extern void doittt(const type[16]);
extern void doitttt(const type[32]);
extern void doittttt(const type[40]);

int main(int argc, const char *argv[]) {
  const char a[3] = { 1, 2, 3 };
  const char b[5] = { 1, 2, 3, 4, 5 };
  const char c[16] = { 1, 2, 3, 4, 5, 6, …
Run Code Online (Sandbox Code Playgroud)

c assembly types x86-64 calling-convention

2
推荐指数
1
解决办法
188
查看次数