我知道x87具有更高的内部精度,这可能是人们在它与SSE操作之间看到的最大差异.但我不得不怀疑,使用x87还有其他好处吗?我有-mfpmath=sse在任何项目中自动输入的习惯,我想知道我是否遗漏了x87 FPU提供的任何其他内容.
我很好奇C++中类型惩罚指针/数组的约定.这是我目前的用例:
通过将其视为32位整数数组(我们知道它的总长度是4的倍数),然后将所有值相加并忽略溢出,计算二进制blob数据的简单32位校验和.
我希望这样的函数看起来像这样:
uint32_t compute_checksum(const char *data, size_t size)
{
const uint32_t *udata = /* ??? */;
uint32_t checksum = 0;
for (size_t i = 0; i != size / 4; ++i)
checksum += udata[i];
return udata;
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,您认为转换data为"最佳"的方式是udata什么?
C风格演员?
udata = (const uint32_t *)data
Run Code Online (Sandbox Code Playgroud)
假设所有指针都是可转换的C++强制转换?
udata = reinterpret_cast<const uint32_t *>(data)
Run Code Online (Sandbox Code Playgroud)
C++在任意指针类型之间使用中间转换void*?
udata = static_cast<const uint32_t *>(static_cast<const void *>(data))
Run Code Online (Sandbox Code Playgroud)
通过工会铸造?
union {
const uint32_t *udata;
const char *cdata;
};
cdata = data;
// now …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序通过TCP接收相对稀疏的流量,没有应用程序级响应.我相信TCP堆栈正在发送延迟的ACK(基于对网络数据包捕获的瞥见).对于单个套接字,在网络堆栈中禁用延迟ACK的建议方法是什么?我已经看过了TCP_QUICKACK,但看起来堆栈会在我的脚下改变它.
这是在Linux 2.6内核上运行的,我并不担心可移植性.
我知道这sizeof是一个编译时计算,但这对我来说似乎很奇怪:编译器可以采用类型名称或表达式(从中推导出类型).但是你如何识别一个类中的类型?似乎唯一的方法是传递一个表达式,这看起来很笨重.
struct X { int x; };
int main() {
// return sizeof(X::x); // doesn't work
return sizeof(X()::x); // works, and requires X to be default-constructible
}
Run Code Online (Sandbox Code Playgroud) 这篇MSDN文章指出getcwd()已被弃用,而且应该使用ISO C++兼容的_getcwd,这就提出了一个问题:是什么让getcwd()不符合ISO标准?
有没有办法在运行时识别可执行文件正在valgrind中运行?我有一组C++单元测试,其中一个期望std::vector::reserve抛出std::bad_alloc.当我在valgrind下运行它时,它完全挽救,阻止我测试内存泄漏(使用valgrind)和行为(期望抛出异常).
这是一个重现它的最小例子:
#include <vector>
int main()
{
size_t uint_max = static_cast<size_t>(-1);
std::vector<char> v;
v.reserve(uint_max);
}
Run Code Online (Sandbox Code Playgroud)
运行valgrind,我得到这个输出:
Warning: silly arg (-1) to __builtin_new()
new/new[] failed and should throw an exception, but Valgrind
cannot throw exceptions and so is aborting instead. Sorry.
at 0x40192BC: VALGRIND_PRINTF_BACKTRACE (valgrind.h:319)
by 0x401C823: operator new(unsigned) (vg_replace_malloc.c:164)
by 0x80487BF: std::vector<char, std::allocator<char> >::reserve(unsigned) new_allocator.h:92)
by 0x804874D: main (vg.cxx:6)
Run Code Online (Sandbox Code Playgroud)
我想修改我的单元测试,以便在从valgrind中运行时简单地跳过有问题的代码.这可能吗?
我有一个大型代码库,它使用了许多不安全的函数,比如gmtime和strtok.我不想尝试搜索代码库并替换这些代码库,而是让编译器在看到它们时发出警告或错误(向维护开发人员强调问题).这可能与GCC有关吗?
我已经知道了__attribute__((deprecated)),但AFAIK我不能使用它,因为我无法控制声明这些函数的头文件.
某些条件可能导致x86 Linux系统上的堆栈溢出:
struct my_big_object[HUGE_NUMBER]在堆栈上.走过它最终会导致SIGSEGV.alloca()程序(类似malloc(),但使用堆栈,将自动释放自己,也与吹起来SIGSEGV,如果它太大).更新:alloca()未按我原先的说法正式弃用; 它只是气馁.有没有办法以编程方式检测本地堆栈是否足够大于给定对象?我知道堆栈大小是可调整的ulimit,所以我希望有一种方法(但它可能是不可移植的).理想情况下,我希望能够做到这样的事情:
int min_stack_space_available = /* ??? */;
if (object_size < min_stack_space_available)
{
char *foo = alloca(object_size);
do_stuff(foo);
}
else
{
char *foo = malloc(object_size);
do_stuff(foo);
free(foo);
}
Run Code Online (Sandbox Code Playgroud) 我有两种方法-a和-b.-a有时会调用-b,而-b有时会调用-a.这两种方法都是私有的,不是从外部调用的.
但我不得不在.h文件中公开其中一个,因为否则编译器会疯狂并对其中任何一个发出警告.
针对该问题,是否有任何有效且良好实践的解决方案?