小编And*_*ker的帖子

支持C++ 11的开源STL实现

简而言之,我正在寻找STLPort的替代品.STLPort有一段时间没有更新(自2008年以来?),并且缺乏C++ 11支持.有谁知道任何替代品?我需要使用各种工具链进行编译,适用于各种体系结构和各种目标操作系统.

我将开始研究GNU C++实现,看看它与GCC工具链的关系如何作为替代,并将回发结果.但如果有人在这里有任何前期知识,那将是伟大的.

替代方案是实现各种关键的C++ 11 STL功能,如新的智能指针类型和std :: threads.最糟糕的情况我可以从boost中提取智能指针.就pthreads或Windows线程而言,是否存在std :: threads的任何实现?

谢谢

c++ stl stlport c++11

14
推荐指数
1
解决办法
3785
查看次数

红色状态栏显示何时不在背景中录制和应用程序

我的应用程序上的状态栏有问题,它可以录音.我有

  <key>UIBackgroundModes</key>
  <array>
    <string>audio</string>
  </array>    
Run Code Online (Sandbox Code Playgroud)

在我的plist中,以便在录制声音并且应用程序在后台时获取红色状态栏通知.但是,如果我停止录制并转到后台,状态栏仍然存在.我在运行4.3.2的iPad 2和运行5.0的iPhone4上看到过这种情况.我认为这是一个> OS4问题,因为我正确终止录制,似乎没有(认证)API来控制状态栏.

有人见过这个/知道如何解决它吗?我怀疑这可能是一个iOS错误,但需要先排除自己:)

到目前为止,我在网上看到的唯一一件事就是这个(未解决的)电子邮件线程:

http://web.archiveorange.com/archive/v/q7bub5A16vw9h9w2lw82

安德鲁

statusbar ios4 ios ios5

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

__sync_val_compare_and_swap 与 __sync_bool_compare_and_swap

我一直在思考这两个函数的返回值。__sync_bool_compare_and_swap 函数的返回值似乎有明显的好处,即我可以用它来判断是否发生了交换操作。但是我看不到 __sync_val_compare_and_swap 的返回值的良好使用。

首先,让我们有一个函数签名供参考(来自 GCC 文档减去 var args):

type __sync_val_compare_and_swap (type *ptr, type oldval type newval);
Run Code Online (Sandbox Code Playgroud)

我看到的问题是 __sync_val_compare_and_swap 的返回值是 *ptr 的旧值。准确地说,它是在适当的内存屏障到位后通过此函数的实现看到的值。我明确指出这是为了满足这样一个事实,即在调用 __sync_val_compare_and_swap 和执行指令以强制执行内存屏障之间,*ptr 的值很容易改变。

现在,当函数返回时,我可以用那个返回值做什么?尝试将其与 *ptr 进行比较是没有意义的,因为现在可以在其他线程上更改 *ptr。同样,比较 newval 和 *ptr 也对我没有真正的帮助(除非我锁定 *ptr 这可能首先会破坏我对原子的使用)。

所以真正留给我做的就是询问是否返回值 == oldval,这实际上是(请参阅下面的警告)询问是否发生了交换操作。所以我可以只使用 __sync_bool_compare_and_swap。

我刚刚提到的警告是,我在这里看到的唯一细微差别是,这样做并没有告诉我交换是否发生,它只是告诉我在释放内存屏障之前的某个时刻 *ptr 具有相同的值为 newval。我正在考虑 oldval == newval 的可能性(尽管我很难找到一种有效实现该函数的方法,以便它可以首先检查这些值而不是交换它们是否相同,所以这可能是一个有争议的问题)。但是,我看不到在呼叫站点知道这种差异会对我产生影响的情况。事实上,我无法想象我会将 oldval 和 newval 设置为相等的情况。

我的问题是:

是否存在使用 __sync_val_compare_and_swap 和 __sync_bool_compare_and_swap 不等效的用例,即是否存在一种情况提供的信息多于另一个的情况?

在旁边

我考虑这个的原因是我发现了一个 __sync_val_compare_and_swap 的实现,它有一个竞争:

inline int32_t __sync_val_compare_and_swap(volatile int32_t* ptr, int32_t oldval, int32_t newval)
{
    int32_t ret = *ptr;
    (void)__sync_bool_compare_and_swap(ptr, oldval, newval);
    return ret; …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc atomic built-in

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

POD结构的值初始化是一个constexpr?

考虑结构:

struct mystruct { };
Run Code Online (Sandbox Code Playgroud)

这总是有效的:

constexpr mystruct mystructInstance = mystruct();
Run Code Online (Sandbox Code Playgroud)

即POD的值初始化是constexpr?类似地,如果结构被定义为:

struct mystruct { ~mystruct(); };
Run Code Online (Sandbox Code Playgroud)

最后,这个怎么样:

struct mystruct { mystruct(); ~mystruct(); };
Run Code Online (Sandbox Code Playgroud)

我没有宣布ctr为constexpr,但有没有任何隐含的扣除规则可以保证这一点吗?

default-constructor value-initialization constexpr c++11

6
推荐指数
1
解决办法
3354
查看次数

在python中将stdout设置为非阻塞

事先警告:出于好奇,我在这里乱砍.我没有具体的理由去做我正在做的事情!

下面是在做Python 2.7.13MacOS 10.12.5

我正在使用python进行攻击,我认为如果我进行stdout非阻塞会发生什么事情会很有趣

fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
Run Code Online (Sandbox Code Playgroud)

打电话fcntl肯定是成功的.然后我尝试写入大量数据(大于OSX上管道的最大缓冲区大小 - 这是65536字节).我以各种方式做到并获得不同的结果,有时是例外,有时似乎是一个很难的失败.

情况1

fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
try:
    sys.stdout.write("A" * 65537)
except Exception as e:
    time.sleep(1)
    print "Caught: {}".format(e)

# Safety sleep to prevent quick exit
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

这总是抛出异常Caught: [Errno 35] Resource temporarily unavailable.我觉得这很有道理.更高级别的文件对象包装器告诉我写入调用失败.

案例2

fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
try:
    sys.stdout.write("A" * 65537)
except Exception as e:
    print "Caught: {}".format(e)

# Safety sleep to prevent quick exit
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

这有时抛出异常Caught: [Errno 35] Resource temporarily …

c python posix nonblocking fcntl

6
推荐指数
1
解决办法
723
查看次数

如果我无限期地在后台运行 Android 线程会发生什么

Android 文档表明 Oreo 对后台执行有新的限制:https://developer.android.com/about/versions/oreo/background。这看起来很合理,他们的目标显然是让自己的平台更像 iOS,并防止应用程序在后台猖獗运行。

我不清楚(事实上,根本没有记录)是当 UI 转到后台时你可以在线程上做什么。具体来说,

鉴于我创建了一个线程

new Thread(() -> { 
     // Naughty thread doing something forever
}).start();
Run Code Online (Sandbox Code Playgroud)

我将应用程序发送到后台

那么...该线程会发生什么?

我创建了非常简单的代码来执行此操作,并且我的线程已经愉快地在 logcat 上运行了 10 多分钟,没有出现任何问题。

有谁有关于此类线程有哪些限制的明确信息?我本以为,由于 Android 限制了后台服务可以执行的操作,因此它也会限制此类线程可以执行的操作。

请注意,我们没有计划编写一个执行此类操作的应用程序。我们只是希望能够编写安全的代码,不会在较新版本的 Android 上引起问题。在 iOS 上,如果您进入后台,那么您将获得一段宽限期来完成您正在做的任何事情(并且您可以要求更多时间),但最终您的线程将被挂起。

multithreading android background-thread android-8.0-oreo

6
推荐指数
1
解决办法
2843
查看次数

有关遗失倾斜意图的Google Play警告

在Google Play上更新我们的应用时,我得到了

You opted-in to Android TV but your APK or Android App Bundle does not have the Leanback intent
Run Code Online (Sandbox Code Playgroud)

这有点奇怪,因为我们在清单中有所有必需的组件来支持电视,即:

<uses-feature
    android:name="android.software.leanback"
    android:required="false" />
<uses-feature
    android:name="android.hardware.touchscreen"
    android:required="false" />
Run Code Online (Sandbox Code Playgroud)

    <activity
        android:name=".MainActivity"
        android:configChanges="orientation"
        android:launchMode="singleTop"
        android:screenOrientation="behind"
        android:theme="@style/AppTheme.Splash">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
        </intent-filter>
    </activity>
Run Code Online (Sandbox Code Playgroud)

<application
    android:banner="@drawable/tv_banner"
Run Code Online (Sandbox Code Playgroud)

(请注意,我们分享电视和手机之间的活动)

我们还包括以下gradle模块:

implementation 'com.android.support:cardview-v7:27.1.1'
implementation 'com.android.support:leanback-v17:27.1.1'
Run Code Online (Sandbox Code Playgroud)

该应用程序也适用于电视设备:)

现在,诚然,我们已经做了一个大的重构,所以我们的应用程序和清单的结构已经发生了很大变化.但是,我没有看到任何与Android开发文档中的要求相矛盾的内容:

https://developer.android.com/training/tv/start/start

有没有人经历过这个?或者,任何人都可以看到其他明显缺失/不正确的东西吗?

android google-play android-tv leanback

6
推荐指数
1
解决办法
989
查看次数

已经"知道"的C++模板参数

这个问题可能是一个很好的答案,但不幸的是我不知道正确的术语,所以......

template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator;
Run Code Online (Sandbox Code Playgroud)

有人可以解释最后一个模板参数吗?我唯一可以推断的是,如果为_Cp指定的参数具有子类型__storage_type,那么模板中任何_Cp :: __ storage_type的使用都将解析为该.如果没有那么意味着_Cp :: __ storage_type解析为0?这对我来说似乎很不合适(或者经过一些实验后可能会出错).

将使用解释以及正确的术语和C++参考.

有兴趣的话,这段代码是从libc ++中提取的.

c++ templates

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

使用selenium(和python)设置下载目录

我本来只是为了 Safari 问这个问题。然而,我还没有找到 Edge、Opera、Safari 和 IE 的答案(尽管我认为后者可能不可能)。由于这个简单的问题似乎没有跳转的地方,我认为这可以全部放入一篇文章中。

问题:Edge、Opera、Safari 和 IE 可以吗?如果是这样,怎么办?

以下是Chrome和Firefox的代码供参考

# Chrome
options = selenium.webdriver.ChromeOptions()
options.add_experimental_option("prefs", {"download.default_directory": download_directory})
driver = selenium.webdriver.Chrome(chrome_options=options)

# Firefox
profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.dir", download_directory)
driver = webdriver.Firefox(firefox_profile=profile)
Run Code Online (Sandbox Code Playgroud)

请注意,如果可以通过其他一些语言绑定实现,那么我确信它是通过 python 实现的。因此,请随意发布非 python 解决方案,一旦我得到提示,我就会翻译!

python safari opera selenium microsoft-edge

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

stp aarch64指令必须与"非连续寄存器对"一起使用

aarch64体系结构没有多个存储和加载的指令,即armv7 arch没有等效的stm和ldm.相反,您必须使用stp和ldp指令来存储和加载寄存器对.

参考ARM参考手册:

http://www.element14.com/community/servlet/JiveServlet/previewBody/41836-102-1-229511/ARM.Reference_Manual.pdf

没有多个寄存器LDM,STM,PUSH和POP指令,但是可以使用非连续寄存器对的加载存储.

我的问题是,非连续意味着什么意思或指的是什么?我的即时反应是,这意味着你不能在这些命令中使用连续编号的寄存器,例如

stp x0, x1, [sp, #-16]!
Run Code Online (Sandbox Code Playgroud)

是非法的.但是我不相信这种情况.我已经看到示例代码正是这样做的,而且我已经设法得到(Apple的)Clang来生成类似的代码,例如

stp x1, x0, [fp, #-16]!
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活思考什么是连续的意味着什么.我认为这可能与使用重叠寄存器有关,例如

stp x0, x0, [sp, #-16]!
stp w0, x0, [sp, #-12]!
Run Code Online (Sandbox Code Playgroud)

但是我已经看到示例代码也在做这类事情(并不是说代码是正确的!).如果是这种情况,我也会明确地使用术语重叠而不是连续.

有任何想法吗?

assembly arm cpu-registers arm64

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

C++右值引用行为(具体示例)

我目前正在尝试使用libc ++来编译和运行MSVC.在这样做的过程中,我遇到了一个令人讨厌的错误(至少我认为是一个错误),这已经花了我一段时间来确定.我有以下repro代码:

int globalInt = 666;

class mini_move_iterator
{
public:

    mini_move_iterator(int* i) : __i(i){}

    int&& operator*() const
    {
        return static_cast<int&&>(*__i);
    }

    int* __i;
};

void foo(int&& rval)
{
    // Smash stack
    char stackUser[1000];
    for (int i = 0; i < 1000; ++i)
        stackUser[i] = 0xff;

    rval += 1;
}

int main()
{
    mini_move_iterator mmi(&globalInt);
    foo(*mmi);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

1)这是合法的,即我是否避免陷入未定义行为的领域(它在语法上是合法的)?

2)foo返回后全局变量globalInt的期望值是多少(未定义可能是可接受的答案)?

编辑:

我应该已经明确表示这在VS与MSVC 12中不起作用.在foo中,变量rval指向堆栈上的临时变量,因此全局变量永远不会递增.

临时是在int && operator*()const中创建的.如果我更换:

return static_cast<int&&>(*__i);
Run Code Online (Sandbox Code Playgroud)

return std::move(*i);
Run Code Online (Sandbox Code Playgroud)

那一切都很好.使用C-cast也会导致临时创建.

c++ rvalue-reference c++11

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