小编pio*_*kg2的帖子

C++ union元素大小基于其他元素大小

考虑以下代码:

struct S
{
    union
    {
        int arr1[10];
        char arr2[sizeof(arr1)];
    };
};
Run Code Online (Sandbox Code Playgroud)

它在c ++ 03和c ++ 11模式下与gcc 4.9.2成功编译.但是,当我改为S像这样的模板时:

template <size_t N>
struct S
{
    union
    {   
        int arr1[N];
        char arr2[sizeof(arr1)];
    };  
};
Run Code Online (Sandbox Code Playgroud)

我得到以下错误输出:

error: int S<10ul>::<anonymous union>::arr1 [10]’ is inaccessible

int arr1[N];

error: within this context

char arr2[sizeof(arr1)];

Clang仅在c ++ 11模式下编译两个版本.我很好奇这里的正确行为是什么.也许我应该明确说明arr2大小是sizeof(int) * N

c++ c++11

45
推荐指数
2
解决办法
1527
查看次数

libclang:如何获取令牌语义

libclang只定义了5种类型的令牌:

  • CXToken_Punctuation
  • CXToken_Keyword
  • CXToken_Identifier
  • CXToken_Literal
  • CXToken_Comment

是否有可能获得有关令牌的更详细信息?例如,对于以下源代码:

struct Type;
void foo(Type param);
Run Code Online (Sandbox Code Playgroud)

我希望输出如下:

  • struct - keyword
  • 类型 - 类型名称
  • ; - 标点符号
  • void - 类型/关键字
  • foo - 函数名称
  • ( - 标点符号
  • 类型 - 函数参数的类型
  • param - 函数参数名称
  • ) - 标点符号
  • ; - 标点符号

我还需要将这些实体映射到文件位置.

c++ libclang

10
推荐指数
1
解决办法
1081
查看次数

用c ++链接用户转换

考虑以下代码:

#include <iostream>

struct C
{
    C() 
    {   
        std::cout << "C()\n";
    }   

    explicit C(const C&) 
    {   
        std::cout << "C(const C&)\n";
    }   

    operator int()
    {   
        std::cout << "int()\n";
        return 1;
    }   

    C(int)
    {   
        std::cout << "C(int)\n";
    }   
};

int main()
{
    C c1; 
    std::cout << '\n';
    C c2 = c1; 
    std::cout << '\n';
    C c3(c1);
}
Run Code Online (Sandbox Code Playgroud)

双方g++clang提供以下的输出:

C()

int()
C(int)

C(const C&)
Run Code Online (Sandbox Code Playgroud)

它不违反规则,说隐式转换序列最多只能包含一个用户转换吗?

c++

7
推荐指数
1
解决办法
327
查看次数

在android opengl es 2.0上进行帧率断断续续

最近我开始开发一些简单的opengl es 2.0 android应用程序,我有动画速度的问题.平均fps不断等于60(每100帧测量一次),但有时动画会在很短的时间内出现断断续续的情况.即使呈现单个三角形也会发生这种情况.当动画继续时我没有分配,并且在动画期间logcat中没有GC事件.

在渲染循环中执行的代码:

public void draw( GLFloatBuffer positionBuffer, int positionBufferOffset, int trianglesCount )
{
    GLES20.glUseProgram( activeGLProgram.glProgramId );

    // Set mvpMatrixValue
    int u_MvpMatrixLocation = GLES20.glGetUniformLocation( activeGLProgram.glProgramId, U_MVP_MATRIX_NAME );
    GLES20.glUniformMatrix4fv( u_MvpMatrixLocation, 1, false, mvpMatrix, 0 );

    // Set vertex position stream
    int a_VertexPositionLocation = GLES20.glGetAttribLocation( activeGLProgram.glProgramId, A_VERTEX_POSITION_NAME );
    GLES20.glBindBuffer( GLES20.GL_ARRAY_BUFFER, positionBuffer.glBufferId );
    GLES20.glEnableVertexAttribArray( a_VertexPositionLocation );

    GLES20.glVertexAttribPointer( a_VertexPositionLocation, POSITION_COORDINATES_PER_VERTEX,
                                  GLES20.GL_FLOAT, false,
                                  0, positionBufferOffset * GLUtilities.BYTES_PER_FLOAT );

    // Draw shape
    GLES20.glDrawArrays( GLES20.GL_TRIANGLES, 0, trianglesCount * 3 );

    // Clear state
    GLES20.glDisableVertexAttribArray( a_VertexPositionLocation …
Run Code Online (Sandbox Code Playgroud)

java android opengl-es

5
推荐指数
0
解决办法
353
查看次数

奇怪的表现结果

我有一个生成的词法分析器.词法分析器在参数中进行回调,并在每次找到匹配时调用它.Callback的原型是:

void(const char *matchBegin, const char *matchEnd, unsigned matchId);
Run Code Online (Sandbox Code Playgroud)

我正在测试它有两个回调:

空回调:

[] (const char *, const char *, unsigned)
{}
Run Code Online (Sandbox Code Playgroud)

递增计数器回调:

[&counter] (const char *, const char *, unsigned id)
{
    counter += id;
}
Run Code Online (Sandbox Code Playgroud)

以下是100MB输入的测量值(除了那些回调之外,程序之间没有区别):

gcc 5.2 empty calback: Avg: 582.3ms, StdDev: 11.3ms (run 20 times)

gcc 5.2 increment callback: Avg: 396.6ms, StdDev: 1.68ms (run 20 times)

clang 3.7 empty calback: 402ms

clang 3.7 increment callback: 577ms

我的直觉是额外的增量操作应该花费我们时间.显然它不是gcc的情况.有谁能解释为什么?

编辑: @Joachim:词法分析器接受参数中的任何函数对象:

template <typename M, typename Action>
inline void tokenize(const M …
Run Code Online (Sandbox Code Playgroud)

c++ performance

5
推荐指数
0
解决办法
167
查看次数

C++ 发出内联函数

假设我有一个包含 function 的公共定义的库void foo();。库在内部调用此函数。为了获得最佳性能,我希望内联内部调用。我还想防止外部代码看到定义,以便稍后我可以在不破坏 ABI 的情况下更改实现。这是一段代码:

MyLib.h:

void foo();
Run Code Online (Sandbox Code Playgroud)

MyLibInlined.h:

inline void foo() { code here }
Run Code Online (Sandbox Code Playgroud)

MyLib.cpp

#define inline
#include "MyLibInlined.h"
Run Code Online (Sandbox Code Playgroud)

问题是它是否违反了 ODR 还是被认为是不好的做法?

编辑:foo如果是成员函数 怎么办?

c++

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

标签 统计

c++ ×5

android ×1

c++11 ×1

java ×1

libclang ×1

opengl-es ×1

performance ×1