小编Tom*_*Tom的帖子

x87优于SSE的优点

我知道x87具有更高的内部精度,这可能是人们在它与SSE操作之间看到的最大差异.但我不得不怀疑,使用x87还有其他好处吗?我有-mfpmath=sse在任何项目中自动输入的习惯,我想知道我是否遗漏了x87 FPU提供的任何其他内容.

x86 sse x86-64 fpu x87

24
推荐指数
4
解决办法
6600
查看次数

关于C++中类型惩罚的观点?

我很好奇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)

c++ casting type-punning

22
推荐指数
2
解决办法
8572
查看次数

禁用TCP延迟ACK

我有一个应用程序通过TCP接收相对稀疏的流量,没有应用程序级响应.我相信TCP堆栈正在发送延迟的ACK(基于对网络数据包捕获的瞥见).对于单个套接字,在网络堆栈中禁用延迟ACK的建议方法是什么?我已经看过了TCP_QUICKACK,但看起来堆栈会在我的脚下改变它.

这是在Linux 2.6内核上运行的,我并不担心可移植性.

linux tcp

18
推荐指数
1
解决办法
3万
查看次数

为什么sizeof不解析struct成员?

我知道这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)

c++ sizeof

17
推荐指数
2
解决办法
2910
查看次数

为什么getcwd()不符合ISO C++?

这篇MSDN文章指出getcwd()已被弃用,而且应该使用ISO C++兼容的_getcwd,这就提出了一个问题:是什么让getcwd()不符合ISO标准?

c++ iso

16
推荐指数
3
解决办法
1万
查看次数

如何检测程序是否在valgrind中运行?

有没有办法在运行时识别可执行文件正在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中运行时简单地跳过有问题的代码.这可能吗?

c++ unit-testing valgrind

9
推荐指数
2
解决办法
3797
查看次数

将库函数标记为已弃用/不可用而不修改其源代码

我有一个大型代码库,它使用了许多不安全的函数,比如gmtimestrtok.我不想尝试搜索代码库并替换这些代码库,而是让编译器在看到它们时发出警告或错误(向维护开发人员强调问题).这可能与GCC有关吗?

我已经知道了__attribute__((deprecated)),但AFAIK我不能使用它,因为我无法控制声明这些函数的头文件.

c c++ gcc

9
推荐指数
2
解决办法
1360
查看次数

是否有可能在Linux上预测C中的堆栈溢出?

某些条件可能导致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)

c linux x86 alloca

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

如果两个方法相互调用并且我不想在头文件中公开其中一个,我该怎么办?

我有两种方法-a和-b.-a有时会调用-b,而-b有时会调用-a.这两种方法都是私有的,不是从外部调用的.

但我不得不在.h文件中公开其中一个,因为否则编译器会疯狂并对其中任何一个发出警告.

针对该问题,是否有任何有效且良好实践的解决方案?

objective-c

0
推荐指数
1
解决办法
211
查看次数

标签 统计

c++ ×5

c ×2

linux ×2

x86 ×2

alloca ×1

casting ×1

fpu ×1

gcc ×1

iso ×1

objective-c ×1

sizeof ×1

sse ×1

tcp ×1

type-punning ×1

unit-testing ×1

valgrind ×1

x86-64 ×1

x87 ×1