小编Chr*_*son的帖子

如何检测无符号整数乘法溢出?

我在C++编写一个程序来找到所有的解决方案b = c ^,其中一个,bc ^一起使用所有的数字0-9只出现一次.该方案在循环值b,并且在每次跑了数字计数程序,b一个b以检查是否数字的条件感到满意.

然而,当可以产生伪解一个b溢出整数限制.我最终使用以下代码检查:

unsigned long b, c, c_test;
...
c_test=c*b;         // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test;      // No overflow
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来测试溢出?我知道有些芯片有一个内部标志,当溢出发生时会设置,但我从未见过通过C或C++访问它.


请注意,在C和C++中,签名 int溢出是未定义的行为,因此您必须在不实际导致它的情况下检测它.有关添加前的signed int overflow,请参阅在C/C++中检测带符号的溢出

c c++ integer-overflow

593
推荐指数
19
解决办法
30万
查看次数

检测是否已在派生类中重新定义C++虚函数的方法

简而言之:从指向派生类实例的C++基类指针,如何在运行时确定是否已重新实现非纯虚函数(在基类中具有实现)派生类?

上下文: 我正在编写一个C++库来解决某些类别的数学方程.该库提供了一个Equation具有多个虚函数的类,库用户将其用作他们希望解决的特定等式的基类.该库还提供了一个Solver类,它接受Equation *一个构造函数参数.然后用户按以下方式编写代码:

class MyEquation : public Equation
{ ... } // equation definition here

int main()
{
  MyEquation myEqn;
  Solver solver(&myEqn);
  solver.Solve();
}
Run Code Online (Sandbox Code Playgroud)

如果虚拟函数的某些组合Equation未在导出的方程类中重新定义,Solver则可以省略由对象运行的算法的某些计算上昂贵的部分.因此,我想知道,在构造函数中Solver,哪些函数已被重新定义,而是将运行默认实现Equation.

  • 我想让这对图书馆的用户透明,所以我不是在寻找一个解决方案,例如,用户在派生方程的构造函数中设置一些标志,指定哪些函数已被重新定义.

  • 一种可能的解决方案是在虚拟函数的默认实现中Equation设置类中的私有标志Equation; Solver然后,类的构造函数可以清除此标志,运行虚函数,并检查标志值以查看是否Equation已调用实现.我想避免这种情况,因为每次执行虚函数时只需设置标志就会使算法减慢很多(这些虚函数的执行对程序的运行时间有很大帮助,而默认实现只返回一个常数).

c++ virtual-functions

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

如何处理任意大整数

我正在编写一种编程语言,今天我得到了可以编译阶乘函数(递归)的点,但是由于整数的最大值,我能得到的最大值是阶乘(12).什么是处理任意最大大小的整数的技术.该语言目前通过将代码转换为C++来工作.

c++ integer overflow integer-overflow long-integer

13
推荐指数
2
解决办法
2万
查看次数

在不使用交换的情况下分配最大缓冲区

在Linux下的C/C++中,我需要分配一个大的(几千兆字节)内存块,以便存储连接到以太网端口的传感器的实时数据和大约110MB/s的流数据.我想分配尽可能多的内存,以最大化我可以存储的数据序列的长度.但是,我还需要确保不会进行磁盘交换,因为产生的延迟和磁盘访问带宽有限会导致传感器(非常有限)的缓冲区溢出.

确定要分配多少内存的最佳方法是什么?我仅限于分配比报告的可用内存稍小的块,还是可以更直接地与linux虚拟内存管理器连接?

c c++ linux virtual-memory

12
推荐指数
1
解决办法
2526
查看次数

SQL中的分层标记

我有一个PHP Web应用程序,它使用MySQL数据库进行对象标记,其中我使用了标记结构作为此SO问题的答案.

我想实现一个标记层次结构,其中每个标记都可以有一个唯一的父标记.然后搜索父标签T将匹配T的所有后代(即T,父母为T的标签(T的子女),T的孙子等).

最简单的方法是在标签表中添加一个ParentID字段,其中包含标签父标签的ID,如果标签没有父标签则添加一些幻数.然而,搜索后代然后需要重复完整搜索数据库以找到每个"代"中的标记,我想避免这些标记.

一个(可能)更快,但更少规范化的方法是使用一个包含每个标记的所有子项的表,甚至每个标记的所有后代.然而,这会冒数据库中数据不一致的风险(例如,标签是多个父项的子项).

是否有一种很好的方法可以使查询快速查找后代,同时尽可能保持数据的标准化?

mysql sql database tags normalizing

8
推荐指数
2
解决办法
2670
查看次数

优化C++ 2-D数组

我需要一种方法来表示C++中的双精度二维数组(密集矩阵),具有绝对最小的访问开销.

我已经在各种linux/unix机器和gcc版本上做了一些时间.向量的STL向量,声明为:

vector<vector<double> > matrix(n,vector<double>(n));
Run Code Online (Sandbox Code Playgroud)

访问matrix[i][j]速度比声明为的数组要慢5%到100%之间:

double *matrix = new double[n*n];
Run Code Online (Sandbox Code Playgroud)

通过内联索引函数访问matrix[index(i,j)],其中index(i,j)求值为i + n*j.在没有STL的情况下安排二维数组的其他方法 - 每行开头的n个指针数组,或者将堆栈中的整个事物定义为常量matrix[n][n]- 以与索引函数方法几乎完全相同的速度运行.

最近的GCC版本(> 4.0)似乎能够在启用优化时将STL向量矢量编译为与非STL代码几乎相同的效率,但这在某种程度上取决于机器.

我想尽可能使用STL,但必须选择最快的解决方案.有没有人有用GCC优化STL的经验?

c++ linux optimization gcc stl

7
推荐指数
4
解决办法
2414
查看次数

分配给较大宽度的整数时的C整数溢出行为

如果我在C中执行以下代码:

#include <stdint.h>

uint16_t a = 4000;
uint16_t b = 8000;

int32_t c = a - b;

printf("%d", c);
Run Code Online (Sandbox Code Playgroud)

它正确打印'-4000'作为结果.但是,我有点困惑:当从另一个中减去一个更大的无符号整数时,不应该有算术溢出吗?这里有什么施法规则?这个问题看起来有点愚蠢,所以任何参考文献都会非常感激.

c integer casting overflow integer-overflow

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

在ofstream :: close()返回后,文件是否可以保证可以立即读取?

我需要我的代码(C++,在Linux上)来调用第二个可执行文件,之前已经编写了一个由第二个程序读取的输出文件.天真的做法,

std::ofstream out("myfile.txt");
// write output here
out.close();
system("secondprogram myfile.txt");
Run Code Online (Sandbox Code Playgroud)

遭遇潜在的竞争条件,即使执行out.close(),文件也无法立即被读取secondprogram?如果是这样,解决这个问题的最佳做法是什么?

三个音符:

  • 如果这是依赖于文件系统的,我对ext3和tmpfs的行为感兴趣.
  • 显然还有其他原因(文件权限等),为什么第二个程序可能无法打开文件; 我只是对竞争条件的潜力感兴趣.
  • 上面示例中的硬编码文件名是为了简单起见; 实际上我用mkstemp.

c++ linux file-io race-condition

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

绘制2D隐式标量场的等值线

我有一个在2D中定义的隐式标量字段,对于2D中的每个点,我可以使它计算精确的标量值,但它的计算有点复杂.
我想绘制该表面的等值线,比如'0'值的线.函数本身是连续的,但'0'等值线可以有多个连续实例,并且不能保证它们都连接在一起.
计算每个像素的值不是一种选择,因为这将花费太多时间 - 大约几秒钟,这需要尽可能实时.

我目前使用的是空间的递归划分,可以将其视为一种四叉树.我对该空间进行初始的,非常粗略的采样,如果我找到一个包含从正值到负值的转换的正方形,我递归地将其划分为4个较小的正方形并再次检查,停在像素级别.通过在其4个角中对sqaure进行采样来检测正 - 负转换.这项工作相当不错,除非它没有.绘制的等值线有时会被切割,因为过渡检测对于在边缘的小区域中发生并且不穿过正方形的角的过渡而失败.

有没有更好的方法在此设置中进行等值线绘制?

math graphics 2d function contour

5
推荐指数
1
解决办法
3694
查看次数

防止浮动包裹,直到元素达到最小宽度

我有可变宽度HTML布局,<div>在可变宽度内容的左侧有一个固定宽度的菜单(由css max-width和min-width设置).对于非常狭窄的浏览器窗口,我希望将内容包装在菜单下面,而我目前通过设置float:left菜单和内容来实现此目的.

<html>
<head>
<title></title>
</head>
<body>
<div style="width: 200px; float: left; border: 1px black solid">Menu (200px wide)</div>
<div style="max-width: 800px; min-width: 300px; float:left; border: 1px black solid">Content div. This div has max-width: 800px; min-width 300px. It has enough text that it expands to its max-width if there is space available to do so.</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在此示例中,div一旦浏览器视口小于1000px(菜单宽度+内容最大宽度),当前就会发生内容的换行.我希望首先减小内容的宽度,并且仅当视口小于500px宽(菜单宽度+内容最小宽度)时才将内容包裹在菜单下方

有没有办法实现这一点,无论是我目前的浮动<div>s 安排,还是其他方式?

html css css-float variable-width

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

溢出c

我有个疑问

当两个16位值加上最大值时,16位机器会出现溢出吗?

我会详细说明

unsigned short a;
unsigned short b;
unsigned long  c;

c=(unsigned long)(a+b);
Run Code Online (Sandbox Code Playgroud)

谈到16位处理器,累加器将是16位大小.上述声明是否会溢出?请澄清.

c overflow integer-overflow

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