我知道我可以设置线程的名称(一个在gdb和HTOP可见)在Linux中使用prctl().但是对于其他操作系统,这很可能不会起作用.此外,我可以尝试使用pthread_setname_np(),这在POSIX系统中更有用,但仍然缺乏完全兼容性.
所以我想有一些更便携的方式,也许是QThread我找不到的东西.有没有这样的方式?
假设有两种类型:
typedef unsigned short Altitude;
typedef double Time;
Run Code Online (Sandbox Code Playgroud)
为了检测一些错误,例如在编译时将高度参数中的时间参数传递给函数,我想禁止从Altitude到的隐式转换,Time反之亦然。
我首先尝试的是声明一个operator Altitude(Time)没有实现的对象,但是编译器说它必须是成员函数,因此我知道它不适用于typedefed类型。
接下来我试着打开这些类型的一成一类,但似乎该项目广泛使用大量的运算,包括隐式转换为double,int,bool等,以及它们传递给,并通过从流operator<<和operator>>。因此,尽管通过这种方式可以让我找到所需的错误,但我什至没有尝试完全实现兼容类,因为这需要大量代码。
所以我的问题是:有没有更优雅的方法来防止两个特定typedefed类型之间的隐式转换,如果可以,那么如何?
考虑一些代码:
#include <iostream>
int main()
{
using std::cout;
int a=3;
cout << "a="<<a<<"\n";
{
int a=a;
cout << "new a = " << a << "\n";
a=5;
cout << "a = " << a << "\n";
}
cout << "old a = " << a << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我希望它能打印出来
a=3
new a = 3
changed a = 5
old a = 3
Run Code Online (Sandbox Code Playgroud)
但我得到的实际上似乎new a = 0在第二行说.我认为它会像类的构造函数中的初始化列表一样工作,其中可以编写类似的
C::C(int a) : a(a) {}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,这是不同的.首先,完全删除外部代码不会导致编译错误.所以我认为这int a=a;是有效的.打开所有编译器警告会导致:
test.cpp: In function …Run Code Online (Sandbox Code Playgroud) 在不支持Intel MPX的处理器上,文档说所有MPX指令都是NOP.也就是说,因为我已经通过所有这些说明看,他们似乎都0F 1A /r或0F 1B /r无前缀或前缀F3,F2或66字节为单位,根据指令.此外,还有以下声明BNDMK:
该指令的reg-reg形式保留了遗留行为(NOP).
我试图用PDF搜索这些操作码(即我的搜索字符串是0F 1),但我发现那里只有MPX指令的描述.展望从2014年2月指令集,我发现很多这种形式的指令,但是他们不是NOP指令,如F2 0F 12 /r被MOVDDUP.并专门寻找0F 1A,0F 1B我没有找到任何东西.
寻找NOP我发现多字节NOP 0F 1F /0,但它与MPX指令形式不一致.
所以我的问题是,它是否记载,遗留下来的行为,其中0F 1A /r和0F 1B /r是NOP?这种形式的指令是一般规则,还是它们代表NOP形式的非NOP指令(如90代表xchg eax,eax)?
阅读这里是龙:你甚至不知道你遇到的问题的进展我已经注意到他们将新算法与glibc中使用的算法进行了比较printf:
Grisu3比GNU libc中printf使用的算法快约5倍
但与此同时,我没有找到任何格式说明符,printf它会自动找到要打印的最佳小数位数.所有我尝试过的都有一些奇怪的默认值,如小数点后的6位数,%f或点%g后的2 位或后点的6位%e.
我如何在文章中提到的glibc中实际使用该算法实现?在glibc中是否真的有这样的实现,甚至标准还是以任何方式讨论过它?
假设我需要制作一个模板,其N长度恰好为位,其中N是模板参数.我当然可以定义这样的东西
#include <cstdint>
template<int N>
struct sized_uint {};
template<> struct sized_uint<8> { typedef uint8_t type; };
template<> struct sized_uint<16> { typedef uint16_t type; };
template<> struct sized_uint<32> { typedef uint32_t type; };
template<> struct sized_uint<64> { typedef uint64_t type; };
Run Code Online (Sandbox Code Playgroud)
然后在我的模板中使用它,例如一个函数:
template<int N> void myfunc(typename sized_uint<N>::type);
Run Code Online (Sandbox Code Playgroud)
但是sized_uint在任何版本的C++中是否有像上面定义的标准类型?
我正在尝试使用 GCC,试图说服它假设代码的某些部分无法访问,以便趁机进行优化。我的一项实验给了我一些奇怪的代码。这是来源:
#include <iostream>
#define UNREACHABLE {char* null=0; *null=0; return {};}
double test(double x)
{
if(x==-1) return -1;
else if(x==1) return 1;
UNREACHABLE;
}
int main()
{
std::cout << "Enter a number. Only +/- 1 is supported, otherwise I dunno what'll happen: ";
double x;
std::cin >> x;
std::cout << "Here's what I got: " << test(x) << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我是这样编译的:
g++ -std=c++11 test.cpp -O3 -march=native -S -masm=intel -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)
函数的代码test如下所示:
_Z4testd:
.LFB1397:
.cfi_startproc
fld QWORD PTR [esp+4] …Run Code Online (Sandbox Code Playgroud) 目前,我的函数转换结果eglGetError()如下:
std::string eglErrorString(EGLint error)
{
switch(error)
{
case EGL_SUCCESS: return "No error";
case EGL_NOT_INITIALIZED: return "EGL not initialized or failed to initialize";
case EGL_BAD_ACCESS: return "Resource inaccessible";
case EGL_BAD_ALLOC: return "Cannot allocate resources";
case EGL_BAD_ATTRIBUTE: return "Unrecognized attribute or attribute value";
case EGL_BAD_CONTEXT: return "Invalid EGL context";
case EGL_BAD_CONFIG: return "Invalid EGL frame buffer configuration";
case EGL_BAD_CURRENT_SURFACE: return "Current surface is no longer valid";
case EGL_BAD_DISPLAY: return "Invalid EGL display";
case EGL_BAD_SURFACE: return "Invalid surface";
case EGL_BAD_MATCH: return …Run Code Online (Sandbox Code Playgroud) GNU汇编程序似乎有一些方法可以控制为某些指令发出的操作码的替代形式.例如
.intel_syntax noprefix
mov eax, ecx
mov.s eax, ecx
Run Code Online (Sandbox Code Playgroud)
处理上面的代码as test.s -o test.o && objdump -d test.o -M intel给出了以下反汇编:
0: 89 c8 mov eax,ecx
2: 8b c1 mov eax,ecx
Run Code Online (Sandbox Code Playgroud)
我们可以看到.s后缀似乎将89操作码切换到8b版本(并适当地更改了ModRM字节).
这种语法在GAS中如何工作?我找不到任何相关文件.
考虑以下"代码":
struct T
{
T();
static int x;
};
T::T::T::T::T::T()
{
}
int T::x;
int main()
{
T t1;
T::T t2;
T* p=static_cast<T::T::T::T*>(&t1);
T::T::T::T::T::x=5;
}
Run Code Online (Sandbox Code Playgroud)
它汇编了4.7到8的g ++和3.5到6的clang ++,没有任何错误或相关的警告-pedantic-errors.显然,可以重复类名后跟范围解析运算符,而不会影响被命名的类类型的含义 - 就好像该类嵌套在自身内部一样.
这是编译器中的错误吗?或者C++语言是否真的以这样的方式定义它容忍这种滥用?
如果它是真正符合标准的C++代码,是否有任何理由允许这样做,或者仅仅是为了简化标准的措辞?