使用预处理器

时间:2016-06-01 08:31:21

标签: c++ arrays c-preprocessor

我想使用预处理器以某种方式填充某些数组。我只能为新声明的数组使用预处理器。但是,我需要更改之前声明和使用的数组p。时间优化对我来说非常重要。

 #define Reverse(x) {x[63], x[62], x[61], x[60], x[59], x[58], x[57], x[56], x[55], x[54], x[53], x[52], x[51], x[50], x[49], x[48], x[47], x[46], x[45], x[44], x[43], x[42], x[41], x[40], x[39], x[38], x[37], x[36], x[35], x[34], x[33], x[32], x[31], x[30], x[29], x[28], x[27], x[26], x[25], x[24], x[23], x[22], x[21], x[20], x[19], x[18], x[17], x[16], x[15], x[14], x[13], x[12], x[11], x[10], x[9], x[8], x[7], x[6], x[5], x[4], x[3], x[2], x[1], x[0] }


    int main()
    {
    int p[64] =  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    int q[64] =  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    //doThings

    p= Reverse(q); // line A - Gives error

    int s[64] = Reverse(q); // line B - Works properly 

    //doThings
}

我收到了这个错误:

  

错误11错误C3079:初始化列表不能用作此赋值运算符的右操作数c:\ users \ ferda \ documents \ visual studio 2013 \ projects \ consoleapplication3 \ consoleapplication3 \ consoleapplication3.cpp 39 3 1 ConsoleApplication3

1 个答案:

答案 0 :(得分:2)

内置数组类型不允许为其分配另一个数组或在已初始化的数组上使用聚合初始化,您必须使用memcpy或for循环来使用新值更新它。如果您使用std::array,您的代码将被编译。它提供operator=

  

operator =(隐式声明)覆盖了每个元素   数组与另一个数组的对应元素(公共成员   功能)

http://coliru.stacked-crooked.com/a/8e664210b7f7f73b

我不确定这是否会像你期望的那样快,gcc会生成很多mov指令:https://godbolt.org/g/tzUqC3。我想使用for循环可能会更快,这需要更少的高速缓存。一如既往地描述您的代码。