考虑以下代码:
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
?
libclang只定义了5种类型的令牌:
是否有可能获得有关令牌的更详细信息?例如,对于以下源代码:
struct Type;
void foo(Type param);
Run Code Online (Sandbox Code Playgroud)
我希望输出如下:
我还需要将这些实体映射到文件位置.
考虑以下代码:
#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)
它不违反规则,说隐式转换序列最多只能包含一个用户转换吗?
最近我开始开发一些简单的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) 我有一个生成的词法分析器.词法分析器在参数中进行回调,并在每次找到匹配时调用它.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) 假设我有一个包含 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
如果是成员函数
怎么办?